Как я могу сказать, какое приложение украло мой фокус в OS X?

25

Активное окно на моей машине иногда теряет фокус. Активное приложение остается прежним - если я был в Chrome раньше, я все еще в Chrome - но активное окно больше не активно. Окно не активно. Это расстраивает; это произошло во время ввода этого вопроса, и мои нажатия клавиш внезапно перестали регистрироваться.

Я считаю, что какое-то другое приложение крадет фокус, но само по себе оно не имеет интерфейса для отображения, поэтому активное окно становится неактивным, но активное приложение остается активным.

Вопрос в том, как отследить нарушающее приложение, чтобы я мог его гневно удалить? Обычно в случаях кражи фокуса виновник очевиден, потому что у него есть фокус. В этом случае я в тупике.

Джош Блихер Снайдер
источник
Вы можете попробовать Apple > Force Quit...меню, чтобы увидеть, если что-то работает, что не должно быть.
Майкл Франк
1
@MichaelFrank Это не покажет приложения, у которых нет строки меню (например, те, у которых LSUIElementустановлено значение truein Info.plist). Те вполне способны на такое поведение.
Даниэль Бек
@DanielBeck Ааа, понял. Это удобно знать.
Майкл Франк
1
К вашему сведению, я задавал в основном этот же вопрос на Apple SE: есть ли способ определить, какая программа ворует фокус на моем Mac?
Кевин Рейд
tell application "System Events" to display alert ((name of first application process whose frontmost is true) as string)к сожалению не учитывает процессы без строки меню.
Даниэль Бек

Ответы:

35

Вот скрипт, который скажет вам, какое приложение активируется, не сообщая вам. Я адаптировал его от ответа на вопрос @ KevinReid на Apple SE .

Оставьте его запущенным в терминале, подождите, пока мошенническое приложение украдет фокус, и посмотрите, какое приложение указано последним. (Для меня: Google Drive. Другие сообщали о материалах Symantec AV.)

#!/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)
medmunds
источник
Этот сценарий говорит мне, что мой виновникGoogle Drive [/Applications/Google Drive.app]
MarkHu
Виновником для меня оказался Symantec.
Джош Блихер Снайдер
1
В моем случае это SecurityAgent [/System/Library/Frameworks/Security.framework/Versions/A/MachServices/SecurityAgent.bundle]
Эд Рэндалл,
Оскорбляющим приложением был Microsoft Update Assistant. Я очень ценю этот ответ, эта проблема уже давно сводит меня с ума.
Джеймсбев
2
Мой виновник был JetBrains Toolbox [/ Applications / JetBrains Toolbox.app/Contents/jetbrains-toolbox-cef.app], пытался обновить себя и сбой в процессе. Большое спасибо! Это также потребляло огромное количество ресурсов.
Габриэль
1

Это будет звучать глупо и нелепо просто ... У меня была такая же проблема с ноутбуком, когда я использовал трекпад или встроенную клавиатуру. Если бы два отдельных ноутбука давали похожий опыт после небольшого количества влаги (да, я пролил на клавиатуру).

Добавление периферийной мыши и клавиатуры решило это для меня.

Пол Е
источник
1
Интересный. Я использую внешнюю мышь и клавиатуру, но, надеюсь, это поможет кому-то еще. Благодарю.
Джош Блихер Снайдер