有没有办法检测什么程序正在将注意力转移到Mac上?


23

我的Mac上的某些应用程序出现问题,窃取了键盘焦点(当前窗口的标题栏变为非活动状态)。但是,它实际上并没有设置任何窗口或菜单栏,并且无法识别键盘快捷键。

有没有一种方法可以确定哪个应用程序具有键盘焦点,即使该应用程序没有菜单栏或Dock图标也是如此?我知道一个内置功能几乎可以做到这一点。如果从键盘调用了“强制退出”对话框,则将打开选中的重点应用程序。但是,它仅列出普通的has-a-dock-icon应用程序,因此在这种情况下无济于事。

当我从10.8升级到10.9时,这种情况就开始发生了。我怀疑我已经安装或与操作系统一起升级的应用程序之一是行为异常。

我愿意接受涉及少量编程(例如AppleScript),使用开发人员工具等的解决方案。但不能使用“卸载之前要卸载的东西”之类的东西,因为这在当前会造成极大的破坏。我想确定性地确定应用程序并提交错误报告或修复其配置。

我的研究仅在Apple支持社区上发现了几个要求相同答案的线索,但没有答案。


我也看到了 10.9.4。也许共享我正在运行的主要应用程序可能会突出一个共同点?Chrome,Firefox,Safari,Wuala,Dropbox,Nitrous,1Password,Google Hangouts,Evernote,Skitch,Google驱动器,Time Machine,Airport Base Station Agent,Android File Transfer Agent。否则...我知道没有简单的解决方案。我怀疑是G Hangouts。
JezC 2014年

Answers:


21

通过将以下代码保存在find_focus_stealer.py文件中并通过python find_focus_stealer.py终端运行它,您可以找到吸引注意力的应用程序。

开始运行脚本–它每隔3秒就会打印出活动应用程序的名称。继续照常工作,等待问题发生,几秒钟后,请在终端中查看输出。罪魁祸首。

就我而言,这是一个Symantec Antivirus后台应用程序(SymUIAgent.app)。

#!/usr/bin/python

from AppKit import NSWorkspace
import time
t = range(1,100)
for i in t:
    time.sleep(3)
    activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName']
    print activeAppName

学分iMichael_此Apple讨论线程


我尝试了这个脚本。每次事件窃取发生时,脚本都会停止运行。窗口中的最后一条日志语句与先前的日志语句没有什么不同,即没有明显的罪魁祸首。脚本刚刚退出,没有错误。
Diodeus-James MacFarlane 2014年

2
这个python程序很好用,但是我必须使用Apple Installed Python。我已经冲煮安装了Python 2.7.8,但不包含AppKit模块。同样在我的计算机上,有问题的应用程序是: SymUIAgent.app Symantec Quick Menu。
卡梅隆·古德勒2014年

2
@Diodeus之所以退出,并不是因为偷走了焦点的应用程序终止了它,而是因为它被编写为只能运行100秒。为了使其运行直到我在该终端窗口中按Ctrl + c,我更改for i in t:while 1:
CenterOrbit

1
真好!对我来说,那是Google Drive.app。我对您的脚本做了些微更新,我将在另一个答案中发布。谢谢!
medmunds 2015年

1
如果遇到no module named appkit,则运行easy_install pip并运行pip install pyobjc。对我来说,它正在Google Drive转移我的注意力
mihai

14

这是对@Ace脚本的稍作更新,该脚本一直运行到您将其杀死为止,并且仅在应用程序名称更改时打印该应用程序名称。同样,将此代码保存在文件中find_focus_stealer.py,然后尝试使用运行它python find_focus_stealer.py

#!/usr/bin/python                                                                                                       

try:
    from AppKit import NSWorkspace
except ImportError:
    print "Can't import AppKit -- maybe you're running python from brew?"
    print "Try running with Apple's /usr/bin/python instead."
    exit(1)

from datetime import datetime
from time import sleep

last_active_name = None
while True:
    active_app = NSWorkspace.sharedWorkspace().activeApplication()
    if active_app['NSApplicationName'] != last_active_name:
        last_active_name = active_app['NSApplicationName']
        print '%s: %s [%s]' % (
            datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            active_app['NSApplicationName'],
            active_app['NSApplicationPath']
        )
    sleep(1)

我可以使用它来跟踪“ Google云端硬盘”,这是Mac上抢焦点的罪魁祸首。


好戏,先生!
布鲁诺·布罗诺斯基

这对我有用。在我的案例中,窃取焦点的应用程序是BetterTouchTool 2.636版本。
罗里·奥肯

1

这是@Ace的答案中提到的脚本的改进版本:

#!/usr/bin/python
# Prints current window focus.
# See: /apple//q/123730
from AppKit import NSWorkspace
import time
workspace = NSWorkspace.sharedWorkspace()
active_app = workspace.activeApplication()['NSApplicationName']
print('Active focus: ' + active_app)
while True:
    time.sleep(1)
    prev_app = active_app
    active_app = workspace.activeApplication()['NSApplicationName']
    if prev_app != active_app:
        print('Focus changed to: ' + active_app)

它将打印具有焦点的活动应用程序的名称,并每秒检查一次它是否更改。

相关脚本:在Gist 上确定哪个应用程序或进程正在将重点放在OSX

用法:

  1. 将上述脚本保存到文件中get_active_focus.py
  2. 使用chmod +x get_active_focus.py命令分配执行属性。
  3. 使用运行文件./get_active_focus.py

输出:

$ ./get_active_focus.py
Active focus: Terminal
Focus changed to: Google Chrome

0

也许检查活动监视器的活动进程?可以轻松排除处于App Nap状态的任何内容,这可能会使搜寻过程变得更短。


是的,这将是一种猜测问题所在的方法,但是我正在寻找可以直接获得信息的东西。
凯文·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.