¿Hay alguna manera de detectar qué programa está robando foco en mi Mac?

23

Tengo un problema con alguna aplicación en mi Mac que roba el foco del teclado (la barra de título de la ventana actual se desactiva). Sin embargo, en realidad no está colocando ninguna ventana o barra de menú propia, y no responde de manera identificable a los atajos de teclado.

¿Hay alguna manera de determinar qué aplicación tiene el foco del teclado incluso si es una de las que no tiene barra de menú o icono de Dock? Sé de una característica incorporada que casi hace esto; el cuadro de diálogo Forzar salida, si se invoca desde el teclado, se abrirá con la aplicación seleccionada seleccionada. Sin embargo, solo enumera las aplicaciones normales de ícono de acoplamiento, por lo que no ayuda en este caso.

Esto comenzó a ocurrir alrededor del tiempo cuando actualicé de 10.8 a 10.9; Sospecho que una de las aplicaciones que ya instalé o actualicé junto con el sistema operativo se está portando mal.

Estoy abierto a soluciones que involucren una pequeña cantidad de programación (o AppleScript, por ejemplo), uso de herramientas de desarrollo, etc .; pero no como "Desinstalar cosas hasta que desaparezca" porque eso sería excesivamente perjudicial en este momento. Me gustaría identificar definitivamente la aplicación y presentar un informe de error o corregir su configuración.

Mi investigación solo ha encontrado un par de hilos que solicitan lo mismo en las comunidades de soporte de Apple que no contenían una respuesta.

Kevin Reid
fuente
Yo también estoy viendo esto. 10.9.4. ¿Quizás compartir las aplicaciones principales que estoy ejecutando podría resaltar algo en común? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google drive, Time Machine, Airport Base Station Agent, Android File Transfer Agent. De lo contrario ... no hay una solución fácil que yo sepa. Mi sospecha es G Hangouts.
JezC

Respuestas:

21

Puede encontrar la aplicación que roba el foco guardando el siguiente código en un find_focus_stealer.pyarchivo y ejecutándolo python find_focus_stealer.pyen un terminal.

Comience a ejecutar el script: imprimirá el nombre de la aplicación activa cada 3 segundos. Siga trabajando como de costumbre, espere a que ocurra el problema y, después de unos segundos, vea la salida en el terminal. Tendrás a tu culpable.

En mi caso, era una aplicación de fondo 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éditos a iMichael_ en este hilo de Discusiones de Apple .

As
fuente
Probé este script. Extrañamente cada vez que ocurre el robo de eventos, el script deja de ejecutarse. La última declaración de registro en la ventana no es diferente de las declaraciones de registro anteriores, es decir, no es un culpable obvio. El script acaba de salir, no hay error.
Diodeus - James MacFarlane
2
Este programa de Python funcionó muy bien, pero tuve que usar el Python instalado de Apple. He instalado Python 2.7.8 y el módulo AppKit no está incluido. También en mi máquina la aplicación infractora era: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale
2
@Diodeus la razón por la cual esto se cierra no es porque la aplicación que robó enfocada la finalizó, sino porque esto se escribió para ejecutarse solo por un período de 100 segundos. Para que se ejecute hasta que presione Ctrl + c en esa ventana de terminal que cambié for i in t:para serwhile 1:
CenterOrbit
1
¡Agradable! Para mí, fue Google Drive.app. Hice una ligera actualización de su script que publicaré en una respuesta por separado. ¡Gracias!
medmunds
1
si te encuentras no module named appkit, entonces corre easy_install pipy pip install pyobjc. Para mí fue Google Driverobar mi atención
mihai
14

Aquí hay una ligera actualización del script de @ Ace que se ejecuta hasta que lo matas y solo imprime el nombre de la aplicación cuando cambia. Nuevamente, guarde este código en un archivo find_focus_stealer.pyy luego intente ejecutarlo con 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)

Pude usar esto para localizar "Google Drive" como el culpable de robar el foco en mi Mac.

medmunds
fuente
Buen espectáculo, señor!
Bruno Bronosky
Esto funcionó para mí. En mi caso, la aplicación de robo de foco fue BetterTouchTool versión 2.636.
Rory O'Kane
1

Aquí hay una versión mejorada del script mencionado en la respuesta 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)

Imprimirá el nombre de la aplicación activa que tiene el foco y detectará si ha cambiado comprobando cada segundo.

Script relacionado: Identifique qué aplicación o proceso está robando foco en OSX en Gist

Uso:

  1. Guarde el script anterior en un archivo get_active_focus.py.
  2. Asigne atributos de ejecución con el chmod +x get_active_focus.pycomando.
  3. Ejecute el archivo con ./get_active_focus.py.

Salida:

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

¿Quizás verificando Activity Monitor para procesos activos? Cualquier cosa en el estado de App Nap podría descartarse fácilmente, y podría hacer que la búsqueda sea mucho más corta.

Rax
fuente
Sí, esa sería una manera de informar una suposición sobre cuál es el problema, pero estoy buscando algo que realmente obtenga la información directamente.
Kevin Reid