Existe-t-il un moyen de détecter quel programme vole le focus sur mon Mac?

23

J'ai un problème avec une application sur mon Mac qui vole le focus du clavier (la barre de titre de la fenêtre actuelle devient inactive). Cependant, il ne met pas en place de fenêtres ou de barre de menus et ne répond pas de manière identifiable aux raccourcis clavier.

Existe-t-il un moyen de déterminer quelle application a le focus clavier même si c'est une de celles qui n'a pas de barre de menu ou d'icône Dock? Je connais une fonction intégrée qui fait presque cela; la boîte de dialogue Forcer à quitter, si elle est invoquée à partir du clavier, s'ouvre avec l'application ciblée sélectionnée. Cependant, il ne répertorie que les applications normales avec une icône de dock, donc cela n'aide pas dans ce cas.

Cela a commencé à se produire au moment où je suis passé de 10,8 à 10,9; Je soupçonne qu'une des applications que j'avais déjà installées ou mises à niveau avec le système d'exploitation se comporte mal depuis peu.

Je suis ouvert aux solutions impliquant une petite quantité de programmation (ou AppleScript, par exemple), l'utilisation d'outils de développement, etc .; mais pas ceux comme «Désinstaller les choses jusqu'à ce qu'elles disparaissent» car cela serait excessivement perturbateur pour le moment. Je voudrais identifier définitivement l'application et déposer un rapport de bug ou corriger sa configuration.

Ma recherche n'a révélé que quelques discussions demandant la même chose sur les communautés de support Apple qui ne contenaient pas de réponse.

Kevin Reid
la source
Je vois ça aussi. 10.9.4. Peut-être que le partage des principales applications que j'utilise pourrait mettre en évidence un point commun? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google Drive, Time Machine, Airport Base Station Agent, Android File Transfer Agent. Sinon ... pas de solution facile que je connaisse. Mon soupçon est G Hangouts.
JezC

Réponses:

21

Vous pouvez trouver l'application qui vole le focus en enregistrant le code suivant dans un find_focus_stealer.pyfichier et en l'exécutant via python find_focus_stealer.pydans un terminal.

Commencez à exécuter le script - il affichera le nom de l'application active toutes les 3 secondes. Continuez à travailler comme d'habitude, attendez que le problème se produise et, après quelques secondes, voyez la sortie dans le terminal. Vous aurez votre coupable.

Dans mon cas, il s'agissait d'une application d'arrière-plan 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

Crédits à iMichael_ dans ce fil de discussion Apple .

Ace
la source
J'ai essayé ce script. Étrangement à chaque fois que le vol d'événement se produit, le script s'arrête. La dernière instruction de journal dans la fenêtre n'est pas différente des instructions de journal précédentes, c'est-à-dire pas de coupable évident. Le script se termine, aucune erreur.
Diodeus - James MacFarlane
2
Ce programme python fonctionnait très bien, mais je devais utiliser le Python installé par Apple. J'avais installé byth Python 2.7.8 et le module AppKit n'est pas inclus. Également sur ma machine, l'application incriminée était: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale
2
@Diodeus, la raison pour laquelle cela se termine n'est pas parce que l'application qui a volé s'est arrêtée, mais parce que cela a été écrit pour ne fonctionner que pendant 100 secondes. Pour le faire fonctionner jusqu'à ce que j'appuie sur Ctrl + c dans cette fenêtre de terminal, j'ai changé for i in t:pour êtrewhile 1:
CenterOrbit
1
Agréable! Pour moi, c'était Google Drive.app. J'ai fait une légère mise à jour de votre script que je posterai dans une réponse séparée. Merci!
medmunds
1
si vous rencontrez no module named appkit, alors exécutez easy_install pipet pip install pyobjc. Pour moi, c'était Google Drivevoler mon attention
mihai
14

Voici une légère mise à jour du script de @ Ace qui s'exécute jusqu'à ce que vous le tuiez et n'imprime le nom de l'application qu'en cas de changement. Encore une fois, enregistrez ce code dans un fichier find_focus_stealer.py, puis essayez de l'exécuter avec 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)

J'ai pu l'utiliser pour retrouver «Google Drive» en tant que coupable de vol de focus sur mon Mac.

medmunds
la source
Bon spectacle, monsieur!
Bruno Bronosky
Cela a fonctionné pour moi. Dans mon cas, l'application de vol de focus était BetterTouchTool version 2.636.
Rory O'Kane
1

Voici une version améliorée du script mentionnée dans la réponse de @ 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)

Il affichera le nom de l'application active qui a le focus et détectera s'il a changé en vérifiant chaque seconde.

Script associé: Identifiez l'application ou le processus qui vole le focus sur OSX chez Gist

Usage:

  1. Enregistrez le script ci-dessus dans un fichier get_active_focus.py.
  2. Attribuez des attributs d'exécution à la chmod +x get_active_focus.pycommande.
  3. Exécutez le fichier avec ./get_active_focus.py.

Sortie:

$ ./get_active_focus.py
Active focus: Terminal
Focus changed to: Google Chrome
kenorb
la source
0

Peut-être vérifier Activity Monitor pour les processus actifs? Tout ce qui se trouve dans l'état App Nap pourrait facilement être exclu, et cela pourrait rendre la chasse beaucoup plus courte.

Rax
la source
Oui, ce serait une façon d'indiquer une supposition sur le problème, mais je cherche quelque chose qui obtient réellement l'information directement.
Kevin Reid