¿Cómo identificar qué proceso está ejecutando qué ventana en Mac OS X?

¿Cómo identificar qué proceso está ejecutando qué ventana en Mac OS X?

Me gustaría saber si es posible identificar qué proceso es responsable de crear/administrar una ventana en Mac OS X.

Por ejemplo, cuando se inician varias instancias de una aplicación, ¿cómo puedo obtener el ID del proceso (PID) correspondiente a una ventana específica? O si hay una ventana de diálogo modal sin título, ¿cómo puedo obtener el PID de su propietario?

Sé que en Windows es posible usar elSuite SysinternalsHerramienta que proporciona una manera de buscar una biblioteca que se esté ejecutando con algunos datos.

Estoy buscando un mecanismo similar al que aparece enesta publicación de blog.

En este caso, usando Sysinternals Suite (y Process Explorer), encontraron qué DLL/programa estaba usando la cámara web buscando una DLL o subcadena (en este caso, usando el nombre físico del dispositivo).

Entonces, ¿existe algún mecanismo o programa, o tienes alguna idea sobre cómo buscar algo similar para Mac OS X? ¿Cómo puedo identificar qué proceso ha abierto una ventana?

Respuesta1

he usadoeste script de Python 2. No es infalible, pero a mí me funciona bastante bien.

Aquí hay un resumen de lo que hace: utiliza CGWindowListCopyWindowInfo, que se importa desde Quartz, para recopilar información de la ventana del sistema, luego le pide al usuario que mueva la ventana deseada, luego recopila información de la ventana nuevamente y muestra información de las que cambiaron. La información volcada incluye el ID del proceso, como kCGWindowOwnerPID.

Aquí está el 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'

El script imprime información para la ventana que cambió de posición dentro de un intervalo de 5 segundos. Entonces la salida se ve así:

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;
    }
)}

Respuesta2

Hice una herramienta llamadalswin

#!/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)

Respuesta3

Existe una herramienta nativa del sistema operativo fácil de usar para inspeccionar cada ventana que proporciona información completa además del proceso relacionado, como la jerarquía del código de origen: se encuentra en Xcode Developer Tools y se llamaAccessibility Inspector

Respuesta4

Puedes usar elAutomator.aplicaciónpara esto:

  1. Iniciar Automator (en tipo foco Automator.app+ Enter)
  2. Crea un nuevo flujo de trabajo.
  3. En el menú seleccioneFlujo de trabajo>Registro(o haga clic en el

información relacionada