2010-01-21 13 views
5

Quiero utilizar la API de accesibilidad para obtener una lista de todas las ventanas para una aplicación determinada (externa).Mac/Cocoa: obtener una lista de ventanas con la API de accesibilidad

El objetivo es comprobar si una determinada ventana está abierta. Primero compruebo que la aplicación se está ejecutando (usando [NSWorkspace runningApplications] y comprobando cada uno), y luego quiero verificar el texto de la barra de título de cada ventana que está abierta para esa aplicación.

PS

Por lo tanto, puede crear un elemento para la aplicación usando el PID:

AXUIElementRef app = AXUIElementCreateApplication(pid); 

pero ¿qué hago con ella? ¿Estoy yendo en la dirección correcta? No puedo creer que sea tan difícil encontrar ejemplos sobre esto.

Respuesta

3

Utilice AXUIElementCopyAttributeValues para copiar el valor de kAXWindowsAttribute, que debe ser una matriz de objetos AXUIElement que representan las ventanas de la aplicación.

Como puede adivinar por su nombre de función, sigue the copy rule.

+0

Nice Hint, Peter. Pero ... No funcionó para mí y finalmente descubrí que siempre tenía 'kAXErrorCannotComplete' cuando intentaba obtener' AXUIElementCopyAttributeNames' (obtengo el 'AXUIElementRef' como en la pregunta original, ¿sería el problema? ?!). –

+0

@StuFFmc: sugiero hacer una pregunta por separado y/o presentar un error. –

2

Puede usar windowNumbersWithOptions:. Enumera todas las ventanas de todas las aplicaciones por su número. Pero no puedo encontrar cómo obtener un NSWindow desde un número de ventana ...

+5

No puede, incluso en principio, obtener una ventana NSW desde un número de ventana, porque la premisa es que lo hace desde una aplicación externa, es decir, otro proceso, y cada puntero NSWindow * está en el espacio de direcciones del proceso que posee la ventana. El número de ventana es el índice que el servidor de ventana usa y proporciona para que cualquier aplicación pueda hacer cosas como instantáneas de pantalla de solicitud. –

9

No sé cómo obtener el ID de ventana y el PID de la API de accesibilidad.
El método NSWindow mencionado por Laurent solo proporciona identificaciones de ventana pero no el PID de la aplicación propietaria de la ventana.
Usaría los métodos CGWindowList que están disponibles desde 10.5.
Para obtener una lista de identificadores de ventana y el PID del dueño puede probar lo siguiente:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
for (NSMutableDictionary* entry in (NSArray*)windowList) 
{ 
    NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName]; 
    NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue]; 
    NSLog(@"%@:%d", ownerName, ownerPID); 
} 
CFRelease(windowList); 

Puede controlar si desea que todas las ventanas (incluyendo fuera de la pantalla, ...) con la opción parametro.
También los objetos de entrada contienen mucha más información. Documentation link

+0

¿Esto también funciona en Swift? Parece que no hay un equivalente de 'kCGNullWindowID' en Swift ... – Blaszard

+0

@Blaszard la constante existe en su forma original en swift -' kCGNullWindowID' –

Cuestiones relacionadas