Como identificar qual processo está executando qual janela no Mac OS X?

Como identificar qual processo está executando qual janela no Mac OS X?

Gostaria de saber se é possível identificar qual processo é responsável por criar/gerenciar uma janela no Mac OS X.

Por exemplo, quando várias instâncias de um aplicativo são iniciadas, como posso obter o ID do processo (PID) correspondente a uma janela específica? Ou se houver uma janela de diálogo modal sem título, como posso obter o PID do seu proprietário?

Eu sei que no Windows é possível usar oSuíte Sysinternalsferramenta que fornece uma maneira de procurar uma biblioteca que esteja sendo executada com alguns dados.

Estou procurando um mecanismo semelhante ao que aparece emesta postagem do blog.

Nesse caso, usando o Sysinternals Suite (e o Process Explorer), eles descobriram qual DLL/programa estava usando a webcam procurando por uma DLL ou substring (nesse caso, usando o nome físico do dispositivo).

Existe algum mecanismo ou programa, ou você tem alguma ideia de como procurar algo semelhante para Mac OS X? Como posso identificar qual processo lançou uma janela?

Responder1

eu useieste script Python 2. Não é infalível, mas funciona muito bem para mim.

Aqui está um resumo do que ele faz: ele usa o CGWindowListCopyWindowInfo, que é importado do Quartz, para coletar informações da janela do sistema, depois pede ao usuário para mover a janela desejada, depois coleta as informações da janela novamente e mostra as informações daquelas que foram alteradas. As informações despejadas incluem o ID do processo, como kCGWindowOwnerPID.

Aqui está o código:

#!/usr/bin/env python

import time
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListExcludeDesktopElements, kCGNullWindowID
from Foundation import NSSet, NSMutableSet

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)
print 'Move target window'
time.sleep(5)
wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)

w = NSMutableSet.setWithArray_(wl1)
w.minusSet_(NSSet.setWithArray_(wl2))
print '\nList of windows that moved:'
print w
print '\n'

O script imprime informações da janela que mudou de posição em um intervalo de 5 segundos. Então a saída fica assim:

List of windows that moved:
{(
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 217;
            Width = 420;
            X = 828;
            Y = 213;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 8;
        kCGWindowMemoryUsage = 406420;
        kCGWindowName = "";
        kCGWindowNumber = 77;
        kCGWindowOwnerName = UserNotificationCenter;
        kCGWindowOwnerPID = 481;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    }
)}

Responder2

Eu fiz uma ferramenta chamadalswin

#!/usr/bin/env python

# Install Quartz with 'pip install -U pyobjc-framework-Quartz'
import Quartz

#wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionOnScreenOnly | Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID)
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)

wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))

#print wl

print('PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + '  ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle')
print('-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + '  ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------')

for v in wl:
    raw_chars = ( \
        str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + \
        ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + \
        ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else \
            ( \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) \
            ) \
            ).ljust(21) + \
        '}' + \
        '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + \
        ('' if v.valueForKey_('kCGWindowName') is None else (' ' + v.valueForKey_('kCGWindowName') or '')) \
    )
    print(raw_chars)

Responder3

Há uma ferramenta nativa do sistema operacional fácil de usar para inspecionar cada janela que fornece informações abrangentes, além do processo relacionado, como a hierarquia de código de origem: é encontrada em Xcode Developer Tools e chamadaAccessibility Inspector

Responder4

Você pode usar oAutomator.apppor esta:

  1. Inicie o Automator (no tipo de destaque Automator.app+ Enter)
  2. Crie um novo fluxo de trabalho.
  3. No menu selecioneFluxo de trabalho>Registro(ou clique no

informação relacionada