2009-11-16 9 views
5

Sto tentando di automatizzare un'applicazione OSX esterna utilizzando l'API di accessibilità. Alcuni di lo stato dell'applicazione non è disponibile tramite l'API, quindi lo acquisisco tramite lo screen scraping . Per fare questo, ho bisogno di ottenere CGWindowID per un oggetto di accessibilità con un 'ruolo di finestra'.CGWindowID da AXUIElement

Esiste un modo diretto per acquisire CGWindowID di un oggetto di accessibilità 'Ruolo finestre'? Posso ottenerlo euristicamente, abbinando vari attributi della finestra, come ad esempio la dimensione, il titolo e la posizione, ma questo è veramente hacky, e mi sentirei meglio se la mia applicazione supportasse anche i casi angolari, anche se sono improbabili.

risposta

4

Non c'è modo di farlo; la gerarchia di accessibilità è completamente disaccoppiata dalla gerarchia attuale di finestre/viste. Penso che la tua corrispondenza funzionerà meglio.

+2

Grazie per la risposta. Lo sospettavo già, ma è bello che qualcuno lo confermi. Ad ogni modo, ho la mia logica di matching che funziona abbastanza bene per i miei scopi attraverso la posizione e la corrispondenza delle dimensioni, così come alcune logiche aggiuntive usate per spostare Windows a sinistra/destra/su/giù in caso di conflitti. – Sami

8

C'è una funzione da almeno Leopard e fino (e ancora in giro a partire da 10.7.3):

extern "C" AXError _AXUIElementGetWindow(AXUIElementRef, CGWindowID* out); 

avvertimenti soliti sull'utilizzo di qualcosa di simile a questo si applica però. Potrebbe cambiare non appena il prossimo aggiornamento del SO!

+0

come hai trovato questa api? – Jason

+1

@Jason Per lo più solo otool (l'equivalente Xcode di nm, ldd, objdump e simili) e alcuni hack basati su di esso che aiutano a dare un senso al disassemblaggio ecc. Questo thread di stackoverflow è utile: http://stackoverflow.com/questions/9494495/what-is-your-favorite-disassembler-tool-in-mac-os-x – mjmt

+0

Funziona ancora? Come dovrei usare questo da Swift? Ho provato e ho ricevuto l'errore "Uso dell'identificatore non risolto" _AXUIElementGetWindow "" –