2010-01-21 7 views
5

Ich möchte die Accessibility API verwenden, um eine Liste aller Fenster für eine bestimmte Anwendung (extern) zu erhalten.Mac/Cocoa - Eine Liste von Fenstern mit Accessibility API erhalten

Ziel ist es zu überprüfen, ob ein bestimmtes Fenster geöffnet ist. Zuerst überprüfe ich, ob die Anwendung läuft (mit [NSWorkspace runningApplications] und überprüfe jedes), und dann möchte ich den Titelbalken-Text jedes Fensters überprüfen, das für diese Anwendung geöffnet ist.

PS

So kann ich ein Element für die App erstellen Sie die PID mit:

AXUIElementRef app = AXUIElementCreateApplication(pid); 

aber was soll ich tun damit? Gehe ich überhaupt in die richtige Richtung? Ich kann nicht glauben, dass es so schwer ist, Beispiele dafür zu finden.

Antwort

3

Verwenden AXUIElementCopyAttributeValues den Wert für kAXWindowsAttribute zu kopieren, die ein Array sein sollte Objekte AXUIElement Fenster der Anwendung darstellt.

Wie Sie von seinem Funktionsnamen erraten können, folgt er the copy rule.

+0

Nice Hint, Peter. Aber ... Es funktionierte nicht für mich und ich fand schließlich heraus, dass ich immer "kAXErrorCannotComplete" hatte, wenn ich versuchte, "AXUIElementCopyAttributeNames" zu bekommen (ich bekomme den "AXUIElementRef" wie bei der ursprünglichen Frage, wäre es das Problem ?!). –

+0

@StuFFmc: Ich schlage vor, eine separate Frage zu stellen und/oder einen Fehler zu melden. –

2

Sie können windowNumbersWithOptions: verwenden. Es listet alle Fenster aller Anwendungen nach ihrer Nummer auf. Aber ich kann nicht finden, wie man eine NSWindow von einer Fensternummer ... erhält

+5

Sie können NSWindow nicht grundsätzlich aus einer Fensternummer beziehen, da die Voraussetzung darin besteht, dass Sie dies von einer externen Anwendung, dh einem anderen Prozess, tun und jeder NSWindow * -Zeiger im Adressraum von Prozess, der das Fenster besitzt. Die Fensternummer ist der Index, den der Windows-Server verwendet und so zur Verfügung stellt, dass jede Anwendung beispielsweise Bildschirm-Snapshots anfordern kann. –

9

Ich weiß nicht eine Weise, Fenster Identifikation und PID von der Zugänglichkeits-API zu erhalten.
Die von Laurent erwähnte NSWindow-Methode stellt nur Fenster-IDs zur Verfügung, nicht jedoch die PID der Anwendung, die das Fenster besitzt.
Ich würde die CGWindowList-Methoden verwenden, die seit 10.5 verfügbar sind.
Um eine Liste der Fenster-IDs und die PID des Eigentümers erhalten Sie folgendes versuchen:

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

Sie steuern, wenn Sie alle Fenster möchten, können (einschließlich Offscreen, ...) mit der Option Paramter.
Auch die Eintragsobjekte enthalten viel mehr Informationen. Documentation link

+0

Funktioniert das auch in Swift? Es scheint, dass es kein Äquivalent von 'kCGNullWindowID' in Swift gibt ... – Blaszard

+0

@Blaszard die Konstante existiert in ihrer ursprünglichen Form in swift -' kCGNullWindowID' –

Verwandte Themen