Gibt es eine Möglichkeit zu erkennen, welches Programm den Fokus auf meinem Mac stiehlt?

23

Ich habe ein Problem mit einer App auf meinem Mac, die den Tastaturfokus stiehlt (die Titelleiste des aktuellen Fensters wird inaktiv). Es werden jedoch keine eigenen Fenster oder Menüleisten angezeigt, und es reagiert nicht erkennbar auf Tastenkombinationen.

Gibt es eine Möglichkeit, festzustellen, welche Anwendung den Tastaturfokus hat, auch wenn es sich um eine Anwendung handelt, für die keine Menüleiste oder kein Dock-Symbol vorhanden ist? Ich kenne ein eingebautes Feature, das dies beinahe macht. Wird das Dialogfeld "Beenden erzwingen" über die Tastatur aufgerufen, wird es mit der ausgewählten fokussierten Anwendung geöffnet. Es werden jedoch nur normale Anwendungen mit einem Dock-Symbol aufgelistet, sodass dies in diesem Fall nicht hilfreich ist.

Dies geschah ungefähr zu der Zeit, als ich von 10.8 auf 10.9 upgegradet habe. Ich vermute, dass sich eine der Apps, die ich bereits installiert oder zusammen mit dem Betriebssystem aktualisiert habe, neuerdings schlecht verhält.

Ich bin offen für Lösungen, bei denen ein geringer Programmieraufwand (z. B. AppleScript), die Verwendung von Entwicklertools usw. erforderlich sind. aber nicht solche wie "Dinge deinstallieren, bis sie verschwinden", da dies im Moment zu störend wäre. Ich möchte die Anwendung eindeutig identifizieren und einen Fehlerbericht einreichen oder ihre Konfiguration korrigieren.

Meine Nachforschungen ergaben nur einige Threads, die dies bei Apple Support Communities anfragten und keine Antwort enthielten.

Kevin Reid
quelle
Ich sehe das auch. 10.9.4. Vielleicht zeigt das Teilen der wichtigsten Apps, die ich ausgeführt habe, eine Gemeinsamkeit auf? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google Drive, Zeitmaschine, Agent der Flughafenbasisstation, Android File Transfer Agent. Ansonsten ... keine einfache Lösung, die ich kenne. Mein Verdacht ist G Hangouts.
JezC

Antworten:

21

Sie finden die App, die den Fokus stiehlt, indem Sie den folgenden Code in einer find_focus_stealer.pyDatei speichern und über python find_focus_stealer.pyein Terminal ausführen .

Starten Sie das Skript - es gibt alle 3 Sekunden den Namen der aktiven App aus. Arbeiten Sie wie gewohnt weiter, warten Sie, bis das Problem auftritt, und sehen Sie nach einigen Sekunden die Ausgabe im Terminal. Du wirst deinen Schuldigen haben.

In meinem Fall war es eine Symantec Antivirus-Hintergrund-App (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

Dank an iMichael_ in diesem Apple Discussions-Thread .

As
quelle
Ich habe dieses Skript ausprobiert. Seltsamerweise wird das Skript bei jedem Ereignisdiebstahl nicht mehr ausgeführt. Die letzte Protokollanweisung im Fenster unterscheidet sich nicht von den vorherigen Protokollanweisungen, dh es liegt kein offensichtlicher Schuldiger vor. Das Skript wird gerade beendet, kein Fehler.
Diodeus - James MacFarlane
2
Dieses Python-Programm hat großartig funktioniert, aber ich musste das von Apple installierte Python verwenden. Ich hatte Python 2.7.8 installiert und das AppKit-Modul ist nicht enthalten. Auch auf meinem Computer war die anstößige App: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale
2
@ Diodeus der Grund, warum dies beendet wird, ist nicht, weil die App, die es gestohlen hat, es beendet hat, sondern weil dies so geschrieben wurde, dass es nur für einen Zeitraum von 100 Sekunden ausgeführt wird. Um es laufen zu lassen, bis ich Strg + C in diesem Terminalfenster drücke, änderte ich mich for i in t:zuwhile 1:
CenterOrbit
1
Nett! Für mich war es Google Drive.app. Ich habe ein kleines Update an Ihrem Skript vorgenommen, das ich in einer separaten Antwort veröffentlichen werde. Vielen Dank!
Medmunds
1
Wenn Sie begegnen no module named appkit, dann laufen Sie easy_install pipund pip install pyobjc. Für mich war es Google Drivemein Fokus zu stehlen
Mihai
14

Hier ist ein kleines Update des Skripts von @ Ace, das so lange ausgeführt wird , bis Sie es beenden und den App-Namen nur dann druckt, wenn er sich ändert. Speichern Sie diesen Code erneut in einer Datei find_focus_stealer.pyund versuchen Sie, ihn mit auszuführen 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)

Auf diese Weise konnte ich "Google Drive" als den Schuldigen für Fokusdiebstahl auf meinem Mac ausfindig machen.

Medmunds
quelle
Gute Show, Sir!
Bruno Bronosky
Das hat bei mir funktioniert. In meinem Fall war die Fokus-Diebstahl-App BetterTouchTool Version 2.636.
Rory O'Kane
1

Hier ist eine verbesserte Version des in der Antwort von @ Ace erwähnten Skripts :

#!/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)

Es wird der Name der aktiven Anwendung gedruckt, die den Fokus hat, und es wird jede Sekunde überprüft, ob er sich geändert hat.

Zugehöriges Skript: Identifizieren Sie, welche App oder welcher Prozess bei Gist den Fokus auf OSX stiehlt

Verwendung:

  1. Speichern Sie das obige Skript in einer Datei get_active_focus.py.
  2. Ordnen Sie mit dem chmod +x get_active_focus.pyBefehl Ausführungsattribute zu .
  3. Führen Sie die Datei mit ./get_active_focus.py.

Ausgabe:

$ ./get_active_focus.py
Active focus: Terminal
Focus changed to: Google Chrome
Kenorb
quelle
0

Überprüfen Sie den Aktivitätsmonitor möglicherweise auf aktive Prozesse? Alles, was sich im App Nap-Status befindet, kann leicht ausgeschlossen werden, und die Jagd wird möglicherweise viel kürzer.

Rax
quelle
Ja, das wäre eine Möglichkeit, eine Vermutung über das Problem anzustellen, aber ich suche nach etwas, das die Informationen tatsächlich direkt erhält.
Kevin Reid