C'è un modo per rilevare quale programma sta rubando il focus sul mio Mac?


23

Ho un problema con alcune app sul mio Mac che rubano lo stato attivo della tastiera (la barra del titolo della finestra corrente diventa inattiva). Tuttavia, in realtà non sta aprendo alcuna finestra o barra dei menu e non risponde in modo identificabile alle scorciatoie da tastiera.

C'è un modo per determinare quale applicazione ha la tastiera attiva anche se è una di quelle che non ha la barra dei menu o l'icona del Dock? Conosco una funzionalità integrata che lo fa quasi; la finestra di dialogo Uscita forzata, se richiamata dalla tastiera, si aprirà con l'applicazione focalizzata selezionata. Tuttavia, elenca solo le normali applicazioni has-a-dock-icon, quindi non aiuta in questo caso.

Ciò ha avuto inizio nel periodo in cui ho effettuato l'aggiornamento da 10.8 a 10.9; Sospetto che una delle app che avevo già installato o aggiornato insieme al sistema operativo si stia comportando male.

Sono aperto a soluzioni che implicano una piccola quantità di programmazione (o AppleScript, diciamo), l'uso di strumenti per sviluppatori, ecc .; ma non quelli come "Disinstalla le cose fino a quando non scompare" perché al momento sarebbe eccessivamente distruttivo. Vorrei identificare definitivamente l'applicazione e presentare una segnalazione di bug o correggerne la configurazione.

La mia ricerca ha rivelato solo un paio di thread che richiedono lo stesso nelle community di supporto Apple che non contenevano una risposta.


Sto vedendo anche questo. 10.9.4. Forse la condivisione delle principali app che ho in esecuzione potrebbe evidenziare un carattere comune? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google Drive, Time Machine, Airport Station Station Agent, Android File Transfer Agent. Altrimenti ... nessuna soluzione facile che io conosca. Il mio sospetto è G Hangouts.
JezC,

Risposte:


21

Puoi trovare l'app che ruba find_focus_stealer.pylo stato attivo salvando il seguente codice in un file ed eseguendolo tramite python find_focus_stealer.pyun terminale.

Inizia a eseguire lo script: stamperà il nome dell'app attiva ogni 3 secondi. Continuare a lavorare come al solito, attendere che si verifichi il problema e dopo alcuni secondi vedere l'output nel terminale. Avrai il tuo colpevole.

Nel mio caso era un'app in background di 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

Crediti a iMichael_ in questo thread di discussioni Apple .


Ho provato questo script. Stranamente ogni volta che si verifica il furto di eventi, lo script si interrompe. L'ultima istruzione di registro nella finestra non è diversa dalle precedenti istruzioni di registro, vale a dire nessun colpevole evidente. Lo script esce appena, nessun errore.
Diodeus - James MacFarlane,

2
Questo programma Python ha funzionato benissimo, ma ho dovuto usare Apple Installed Python. Avevo installato Python 2.7.8 e il modulo AppKit non è incluso. Anche sul mio computer l'app offensiva era: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale,

2
@Diodeus il motivo per cui questo esce non è perché l'app che ha rubato focalizzato l'ha chiuso, ma perché questo è stato scritto per funzionare solo per un periodo di 100 secondi. Per farlo funzionare finché non premo Ctrl + c nella finestra del terminale che ho cambiato for i in t:inwhile 1:
CenterOrbit

1
Bello! Per me, è stato Google Drive.app. Ho fatto un leggero aggiornamento alla tua sceneggiatura che posterò in una risposta separata. Grazie!
medmunds,

1
se incontri no module named appkit, corri easy_install pipe pip install pyobjc. Per me stava Google Driverubando la mia attenzione
mihai il

14

Ecco un leggero aggiornamento dello script di @ Ace che viene eseguito fino a quando non lo uccidi e stampa il nome dell'app solo quando cambia. Ancora una volta, salva questo codice in un file find_focus_stealer.pye prova a eseguirlo 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)

Sono stato in grado di utilizzare questo per rintracciare "Google Drive" come colpevole del mio Mac.


Bello spettacolo, signore!
Bruno Bronosky,

Questo ha funzionato per me. Nel mio caso l'applicazione messa a fuoco rubare era BetterTouchTool versione 2.636.
Rory O'Kane,

1

Ecco una versione migliorata dello script menzionata nella risposta di @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)

Stamperà il nome dell'applicazione attiva che ha lo stato attivo e rileverà se è cambiato controllando ogni secondo.

Script correlato: identifica quale app o processo sta rubando il focus su OSX su Gist

Uso:

  1. Salvare lo script sopra in un file get_active_focus.py.
  2. Assegna gli attributi di esecuzione con il chmod +x get_active_focus.pycomando.
  3. Esegui il file con ./get_active_focus.py.

Produzione:

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

0

Forse controllando Activity Monitor per i processi attivi? Qualsiasi cosa nello stato di App Nap potrebbe essere facilmente esclusa e potrebbe rendere la caccia molto più breve.


Sì, sarebbe un modo per informare un'ipotesi su quale sia il problema, ma sto cercando qualcosa che ottenga direttamente le informazioni.
Kevin Reid,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.