2010-01-21 12 views
5

Voglio usare l'API di accessibilità per ottenere un elenco di tutte le finestre per una determinata applicazione (esterna).Mac/Cacao - Ottenere un elenco di finestre usando l'API di accessibilità

L'obiettivo è verificare se una determinata finestra è aperta. Per prima cosa controllo che l'applicazione sia in esecuzione (usando [NSWorkspace runningApplications] e controllandone ciascuna), quindi voglio controllare il testo della barra del titolo di ogni finestra aperta per quella applicazione.

PS

così posso creare un elemento per l'applicazione utilizzando il PID:

AXUIElementRef app = AXUIElementCreateApplication(pid); 

ma cosa devo fare con esso? Sto andando anche nella direzione giusta? Non posso credere che sia così difficile trovare esempi su questo.

risposta

3

Utilizzare AXUIElementCopyAttributeValues per copiare il valore per kAXWindowsAttribute, che dovrebbe essere una matrice di oggetti AXUIElement che rappresentano le finestre dell'applicazione.

Come si può intuire dal nome della sua funzione, segue the copy rule.

+0

Nice Hint, Peter. Ma ... Non ha funzionato per me e alla fine ho scoperto che ho sempre avuto 'kAXErrorCannotComplete' quando cercavo di ottenere' AXUIElementCopyAttributeNames' (sto ricevendo il 'AXUIElementRef' come nella domanda originale, sarebbe il problema ?!). –

+0

@StuFFmc: Suggerisco di fare una domanda separata e/o presentare un bug. –

2

È possibile utilizzare windowNumbersWithOptions:. Elenca tutte le finestre di tutte le applicazioni in base al loro numero. Ma non riesco a trovare come ottenere uno NSWindow da un numero di finestra ...

+5

Non si può, in linea di principio, ottenere una NSWindow da un numero di finestra, perché la premessa è che si sta facendo da un'applicazione esterna, cioè da un altro processo, e ogni puntatore NSWindow * si trova nello spazio degli indirizzi del processo che possiede la finestra. Il numero della finestra è l'indice che il server della finestra usa e fornisce in modo che qualsiasi applicazione possa fare cose come le istantanee della schermata di richiesta. –

9

Non conosco un modo per ottenere ID finestra e PID dall'API di accessibilità.
Il metodo NSWindow indicato da Laurent fornisce solo gli ID di finestra ma non il PID dell'applicazione di proprietà della finestra.
Vorrei utilizzare i metodi CGWindowList disponibili dal 10.5.
Per ottenere un elenco di ID delle finestre e il PID del proprietario si può provare il seguente:

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

È possibile controllare se si desidera che tutte le finestre (compresi i fuori campo, ...) con l'opzione paramter.
Anche gli oggetti di ingresso contengono molte più informazioni. Documentation link

+0

Funziona anche in Swift? Sembra che non ci sia l'equivalente di 'kCGNullWindowID' in Swift ... – Blaszard

+0

@Blaszard la costante esiste nella sua forma originale in swift -' kCGNullWindowID' –

Problemi correlati