Есть ли способ определить, какая программа ворует фокус на моем 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, агент базовой станции аэропорта, агент передачи файлов Android. В противном случае ... не простое решение, которое я знаю. Мое подозрение - G Hangouts.
JezC

Ответы:


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 .


Я попробовал этот скрипт. Странно, что каждый раз, когда происходит кража событий, скрипт перестает работать. Последний оператор журнала в окне ничем не отличается от предыдущих операторов журнала, то есть не является очевидным виновником. Сценарий просто выходит, без ошибок.
Диодей - Джеймс Макфарлейн

2
Эта программа на Python отлично работала, но мне пришлось использовать установленный Apple Python. Я установил Python 2.7.8, и модуль AppKit не включен. Также на моей машине было нарушено приложение: SymUIAgent.app Symantec Quick Menu.
Кэмерон Гудэйл

2
@Diodeus причина, по которой это происходит, не в том, что приложение, которое украло фокус, закончило его, а в том, что оно было написано так, чтобы работать только в течение 100 секунд. Чтобы он работал до тех пор, пока я не нажму Ctrl + c в окне терминала, я изменился for i in t:наwhile 1:
CenterOrbit

1
Ницца! Для меня это был Google Drive.app. Я сделал небольшое обновление для вашего сценария, который я опубликую в отдельном ответе. Благодарность!
Медмунд

1
если встретишь no module named appkit, то беги easy_install pipи pip install pyobjc. Для меня это Google Drive
украло

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 Drive» как виновника кражи фокуса на моем 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)

Он напечатает имя активного приложения, которое имеет фокус, и обнаружит, изменилось ли оно, проверяя каждую секунду.

Связанный сценарий: Определить , какие приложения или процесс крадет фокус на OSX на Gist

Использование:

  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

Возможно, проверка Activity Monitor для активных процессов? Все в состоянии App Nap может быть легко исключено, и это может сделать охоту намного короче.


Да, это был бы способ сообщить догадку о том, в чем проблема, но я ищу что-то, что действительно получает информацию напрямую.
Кевин Рид,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.