Existe uma maneira de detectar qual programa está roubando o foco no meu Mac?


23

Estou com um problema com um aplicativo no meu Mac que rouba o foco do teclado (a barra de título da janela atual fica inativa). No entanto, na verdade, ele não está instalando nenhuma janela ou barra de menus e não responde de maneira identificável aos atalhos do teclado.

Existe uma maneira de determinar em qual aplicativo o teclado está focado, mesmo que seja um daqueles que não possui barra de menus ou ícone do Dock? Conheço um recurso embutido que quase faz isso; a caixa de diálogo Forçar encerramento, se chamada pelo teclado, será aberta com o aplicativo focado selecionado. No entanto, ele lista apenas aplicativos normais com um ícone de encaixe, portanto, não ajuda nesse caso.

Isso começou a ocorrer quando eu atualizei de 10,8 para 10,9; Suspeito que um dos aplicativos que eu já tinha instalado ou atualizado junto com o sistema operacional esteja se comportando de novo.

Estou aberto a soluções que envolvam uma pequena quantidade de programação (ou AppleScript, por exemplo), uso de ferramentas de desenvolvedor, etc .; mas não como "Desinstalar coisas até que desapareça", porque isso seria excessivamente perturbador no momento. Gostaria de identificar definitivamente o aplicativo e arquivar um relatório de bug ou corrigir sua configuração.

Minha pesquisa encontrou apenas alguns threads solicitando o mesmo nas comunidades de suporte da Apple que não continham uma resposta.


Eu também estou vendo isso. 10.9.4 Talvez o compartilhamento dos principais aplicativos que eu esteja executando possa destacar um ponto em comum? Chrome, Firefox, Safari, Wuala, Dropbox, Nitrous, 1Password, Google Hangouts, Evernote, Skitch, Google drive, Time Machine, Agente da estação base do aeroporto, Agente de transferência de arquivos do Android. Caso contrário ... não há solução fácil que eu conheça. Minha suspeita é o G Hangouts.
JezC

Respostas:


21

Você pode encontrar o aplicativo que rouba o foco salvando o código a seguir em um find_focus_stealer.pyarquivo e executando-o via python find_focus_stealer.pyem um terminal.

Comece a executar o script - ele imprimirá o nome do aplicativo ativo a cada 3 segundos. Continue trabalhando normalmente, aguarde o problema ocorrer e, após alguns segundos, veja a saída no terminal. Você terá o seu culpado.

No meu caso, era um aplicativo de segundo plano do 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 para iMichael_ em esta discussão As discussões da Apple .


Eu tentei esse script. Estranhamente, toda vez que o roubo de eventos acontece, o script para de ser executado. A última instrução de log na janela não é diferente das instruções de log anteriores, ou seja, nenhum culpado óbvio. O script acabou de sair, sem erro.
Diodeus - James MacFarlane

2
Este programa python funcionou muito bem, mas eu tive que usar o Apple Installed Python. Eu instalei o Python 2.7.8 e o módulo AppKit não está incluído. Também na minha máquina, o aplicativo incorreto era: SymUIAgent.app Symantec Quick Menu.
Cameron Goodale

2
@Diodeus, a razão pela qual essa saída não ocorre porque o aplicativo que roubou o foco foi finalizado, mas porque isso foi escrito para ser executado apenas por um período de 100 segundos. Para fazê-lo funcionar até que eu pressione Ctrl + c naquela janela do terminal, mudei for i in t:para serwhile 1:
CenterOrbit

1
Agradável! Para mim, era o Google Drive.app. Fiz uma pequena atualização no seu script, que postarei em uma resposta separada. Obrigado!
medmunds

1
se você encontrar no module named appkit, execute easy_install pipe pip install pyobjc. Para mim, estava Google Driveroubando o meu foco #
191

14

Aqui está uma pequena atualização do script do @ Ace, que dura até você matá-lo e só imprime o nome do aplicativo quando ele é alterado. Novamente, salve esse código em um arquivo find_focus_stealer.pye tente executá-lo com 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)

Consegui usar isso para rastrear o "Google Drive" como o culpado de roubar o foco no meu Mac.


Bom show, senhor!
Bruno Bronosky

Isso funcionou para mim. No meu caso, o aplicativo de roubo de foco era o BetterTouchTool versão 2.636 .
Rory O'Kane

1

Aqui está a versão aprimorada do script mencionado na resposta do @ 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)

Ele imprimirá o nome do aplicativo ativo que tem o foco e detectará se foi alterado verificando a cada segundo.

Script relacionado: identifique qual aplicativo ou processo está roubando o foco no OSX no Gist

Uso:

  1. Salve o script acima em um arquivo get_active_focus.py.
  2. Atribua atributos de execução com o chmod +x get_active_focus.pycomando
  3. Execute o arquivo com ./get_active_focus.py.

Saída:

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

0

Talvez verificando o Activity Monitor em busca de processos ativos? Qualquer coisa no estado App Nap poderia facilmente ser descartada, e isso poderia tornar a caçada muito mais curta.


Sim, isso seria uma maneira de informar um palpite sobre qual é o problema, mas estou procurando por algo que realmente obtenha as informações diretamente.
Kevin Reid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.