Czy istnieje sposób na wykrycie, który program kradnie fokus na moim komputerze Mac?

23

Mam problem z pewną aplikacją na komputerze Mac kradnącą fokus klawiatury (pasek tytułu bieżącego okna staje się nieaktywny). Jednak w rzeczywistości nie wyświetla własnych okien ani pasków menu i nie reaguje w sposób identyfikowalny na skróty klawiaturowe.

Czy istnieje sposób, aby określić, która aplikacja ma fokus klawiatury, nawet jeśli jest to jedna z tych, które nie mają paska menu ani ikony Docku? Znam jedną wbudowaną funkcję, która prawie to robi; okno dialogowe Force Quit, jeśli zostanie wywołane z klawiatury, otworzy się z wybraną aktywną aplikacją. Wymienia jednak tylko zwykłe aplikacje z ikoną dokowania, więc w tym przypadku nie pomaga.

Zaczęło się to mniej więcej w czasie, gdy uaktualniłem z 10,8 do 10,9; Podejrzewam, że jedna z aplikacji, które już zainstalowałem lub zaktualizowałem wraz z systemem operacyjnym, jest ostatnio źle funkcjonująca.

Jestem otwarty na rozwiązania wymagające niewielkiej ilości programowania (powiedzmy AppleScript), korzystania z narzędzi programistycznych itp .; ale nie takie jak „Odinstaluj rzeczy, dopóki nie zniknie”, ponieważ w tej chwili byłoby to nadmiernie destrukcyjne. Chciałbym ostatecznie zidentyfikować aplikację i zgłosić błąd lub naprawić jego konfigurację.

Moje badania ujawniły tylko kilka wątków z prośbą o to samo w społecznościach wsparcia Apple, które nie zawierały odpowiedzi.

Kevin Reid
źródło
Też to widzę. 10.9.4. Być może udostępnianie głównych aplikacji, które mam uruchomione, może uwypuklić podobieństwo? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, dysk Google, Time Machine, Airport Base Station Agent, Android File Transfer Agent. W przeciwnym razie ... nie ma łatwego rozwiązania, które znam. Moje podejrzenie to G Hangouts.
JezC

Odpowiedzi:

21

Możesz znaleźć aplikację, która kradnie fokus, zapisując następujący kod w find_focus_stealer.py pliku i uruchamiając go za python find_focus_stealer.pypomocą terminala.

Rozpocznij uruchamianie skryptu - co 3 sekundy będzie drukować nazwę aktywnej aplikacji. Pracuj normalnie, poczekaj na wystąpienie problemu i po kilku sekundach zobacz wynik w terminalu. Będziesz miał winowajcę.

W moim przypadku była to aplikacja Symantec Antivirus działająca w tle (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

Podziękowania dla iMichael_ w tym wątku Dyskusje Apple .

As
źródło
Próbowałem tego skryptu. Co dziwne, za każdym razem, gdy następuje kradzież zdarzeń, skrypt przestaje działać. Ostatnia instrukcja dziennika w oknie nie różni się od poprzednich instrukcji dziennika, tzn. Nie ma oczywistego winowajcy. Skrypt właśnie kończy działanie, bez błędu.
Diodeusz - James MacFarlane
2
Ten program w Pythonie działał świetnie, ale musiałem użyć Pythona zainstalowanego przez Apple. Miałem zainstalowany browar Python 2.7.8 i moduł AppKit nie jest dołączony. Również na moim komputerze obrażająca aplikacja była: SymUIAgent.app Symantec Szybkie menu.
Cameron Goodale,
2
@Diodeus przyczyną tego wyjścia nie jest to, że aplikacja, która ukradła skoncentrowane, zakończyła go, ale dlatego, że napisano go tak, aby działał tylko przez 100 sekund. Aby działał do momentu naciśnięcia klawiszy Ctrl + cw tym oknie terminala zmieniłem nazwę for i in t:nawhile 1:
CenterOrbit
1
Miły! Dla mnie był to Google Drive.app. Zrobiłem niewielką aktualizację twojego skryptu, który opublikuję w osobnej odpowiedzi. Dzięki!
medmunds
1
jeśli napotkasz no module named appkit, uruchom easy_install pipi pip install pyobjc. Dla mnie to Google Drivekradło mój cel
mihai
14

Oto niewielka aktualizacja skryptu @ Ace, który działa, dopóki go nie zabijesz i drukuje tylko nazwę aplikacji, gdy się zmieni. Ponownie zapisz ten kod w pliku, find_focus_stealer.pya następnie spróbuj go uruchomić 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)

Byłem w stanie to wykorzystać do wyśledzenia „Dysku Google” jako winowajcy kradnącego ostrość na moim komputerze Mac.

medmunds
źródło
Dobry program, Sir!
Bruno Bronosky,
To zadziałało dla mnie. W moim przypadku aplikacja kradnąca ostrość to BetterTouchTool wersja 2.636.
Rory O'Kane,
1

Oto ulepszona wersja skryptu wymieniona w odpowiedzi @ 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)

Wydrukuje nazwę aktywnej aplikacji, która ma fokus i wykryje, czy zmieniła się, sprawdzając co sekundę.

Powiązany skrypt: Zidentyfikuj, która aplikacja lub proces kradnie nacisk na OSX w Gist

Stosowanie:

  1. Zapisz powyższy skrypt w pliku get_active_focus.py.
  2. Przypisz atrybuty wykonania za pomocą chmod +x get_active_focus.pypolecenia.
  3. Uruchom plik za pomocą ./get_active_focus.py.

Wydajność:

$ ./get_active_focus.py
Active focus: Terminal
Focus changed to: Google Chrome
kenorb
źródło
0

Być może sprawdzanie Monitora aktywności w poszukiwaniu aktywnych procesów? Wszystko w stanie App Nap można łatwo wykluczyć, a polowanie może być znacznie krótsze.

Rax
źródło
Tak, byłby to sposób na poinformowanie domysłów o tym, na czym polega problem, ale szukam czegoś, co faktycznie uzyska informacje bezpośrednio.
Kevin Reid