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:
- Inicie o Automator (no tipo de destaque
Automator.app
+ Enter) - Crie um novo fluxo de trabalho.
- No menu selecioneFluxo de trabalho>Registro(ou clique no