Как я могу сказать, какое приложение украло мой фокус в 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)

Этот сценарий говорит мне, что мой виновник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
Интересный. Я использую внешнюю мышь и клавиатуру, но, надеюсь, это поможет кому-то еще. Благодарю.
— Джош Блихер Снайдер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.