Sto tentando di correggere an application che ridimensiona le finestre utilizzando l'API di accessibilità.Identificare in modo univoco la finestra attiva su OS X
Ho bisogno di mantenere un dizionario con le dimensioni precedenti di Windows. La chiave deve identificare la finestra attualmente attiva. Al momento, questa finestra attiva viene recuperata tramite NSAccessibilityFocusedWindowAttribute
premendo un tasto di scelta rapida.
Tuttavia, ogni volta che viene chiamato questo metodo, il valore restituito AXUIElementRef
che identifica la finestra è diverso! Questo ovviamente significa che non posso usarlo come chiave del dizionario - il dizionario non troverà la voce corrispondente.
Il seguente codice riproduce il problema:
-(IBAction)testWindowIdentification:(id)sender{
AXUIElementRef focusedApp;
AXUIElementRef focusedWindow;
AXUIElementCopyAttributeValue(_systemWideElement,
(CFStringRef) kAXFocusedApplicationAttribute,
(CFTypeRef*) &focusedApp);
AXUIElementCopyAttributeValue((AXUIElementRef) focusedApp,
(CFStringRef) NSAccessibilityFocusedWindowAttribute,
(CFTypeRef*) &focusedWindow);
CFShow(focusedWindow);
}
_systemWideElement
è stato inizializzato nel metodo init
utilizzando una chiamata a AXUIElementCreateSystemWide()
.
La dichiarazione CFShow
mostra chiaramente diversi ID ogni volta che il metodo viene chiamato (anche se la stessa finestra è attiva), che è inutile per me:
<AXUIElement 0x47e850> {pid=42463}
<AXUIElement 0x47e890> {pid=42463}
<AXUIElement 0x47e2c0> {pid=42463}
…
Il documentation on AXUIElement
non mostra alcun metodo che recupera un attributo univoco per l'elemento UI, e nemmeno lo fa that of the NSAccessibility
protocol. Il PID univoco è non abbastanza per me, poiché un processo può avere più finestre.
Come recuperare un identificatore univoco della finestra attiva in Cocoa?
(A proposito, il codice vero e proprio sta controllando i codici di ritorno delle chiamate di cui sopra, non c'è nessun errore, le chiamate riescono.)
@JeremyBanks Il risponditore originale ha l'idea giusta qui. Puoi effettivamente usare Quartz per ottenere un 'CGWindowID' dopo aver determinato la finestra focalizzata, se [questa risposta] (http://stackoverflow.com/a/312099/517815) deve essere creduta. Questo _should_ ti dà l'identificatore di finestra univoco che stai sperando, che puoi passare impunemente nel contesto della tua attuale applicazione. Fammi sapere se desideri una versione più coerente e completa di questo come una risposta reale. – MrGomez
@MrGomez Certo, una risposta del genere sarebbe grandiosa. :) –
@JeremyBanks Lo farà. Oggi sono un po 'sovraccarico, ma cercherò di ottenere una risposta a questo qualche tempo dopo questa sera (PST). :) – MrGomez