Чи є спосіб виявити, яка програма краде фокус на моєму Mac?


23

У мене проблема з деяким додатком на моєму Mac, який викрав фокус клавіатури (рядок заголовка поточного вікна стає неактивним). Однак він насправді не створює власних вікон або панелей меню, і він не відповідає ідентично на комбінації клавіш.

Чи є спосіб визначити, який додаток має фокус на клавіатурі, навіть якщо він є одним із тих, у яких немає рядка меню чи значка док-станції? Я знаю одну вбудовану функцію, яка майже робить це; діалогове вікно Force Quit, якщо його викликати з клавіатури, відкриється, якщо вибрано зосереджений додаток. Однак у ньому перераховано лише звичайні програми із значками-доками, тому це не допомагає в цьому випадку.

Це почало відбуватися приблизно в той час, коли я перейшов з 10,8 до 10,9; Я підозрюю, що один із застосунків, які я вже встановив або модернізував разом із ОС, нещодавно не поводиться.

Я відкритий для рішень, що передбачають невелику кількість програмування (або AppleScript, скажімо), використання інструментів для розробників тощо; але не такі, як "Видаліть речі, поки вони не зникнуть", оскільки це було б надмірно руйнівним на даний момент. Я хотів би остаточно визначити додаток і подати звіт про помилку або виправити його конфігурацію.

У моєму дослідженні з’явилося лише кілька ниток із запитом на те саме в Apple Support Communities, які не містили відповіді.


Я також бачу це. 10.9.4. Можливо, обмін основними програмами, які я працюю, може висвітлити спільність? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google Drive, 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 чудово працювала, але мені довелося використовувати встановлений Python Apple. У мене було встановлено варити Python 2.7.8, і модуль AppKit не включений. Також на моїй машині зловмисним додатком було: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale

2
@Diodeus причина, чому це завершується, полягає не в тому, що додаток, який викрав фокус, закінчив його, а тому, що це було написано, щоб він працював лише протягом 100 секунд. Щоб змусити його працювати, поки я не натискаю Ctrl + c у цьому вікні терміналу, я змінив for i in t:йогоwhile 1:
CenterOrbit

1
Приємно! Для мене це був Google Drive.app. Я трохи оновив ваш сценарій, який я опублікую в окремій відповіді. Спасибі!
medmunds

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.
Rory O'Kane

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

Можливо перевірка Монітора активності на активні процеси? Все, що знаходиться у стані Nap Nap, може бути легко виключено, і це може зробити полювання набагато коротшим.


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