2014-06-07 15 views
10

Wie kann ich eine Liste aller derzeit auf dem Bildschirm angezeigten Fenster in erhalten? (Alle Beispiele werden mit vorangestelltem import Cocoa)Wie kann ich eine Liste aller momentan auf dem Bildschirm angezeigten Fenster in swift bekommen?

In Objective-c Ich kann den folgenden Code ausführen erfolgreich:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 

Aber wenn ich laufe das Äquivalent in schnellen (mit dem Spielplatz zu testen) :

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID) 

ich erhalte einen Fehler mir zu sagen, dass ich ein Use of unresolved identifier 'kcGNullWindowID' habe.

Nachdem das Spiel mit Hilfe der quartz documentation für eine Weile Ich habe zu bekommen:

let windowList = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowListOption(0)) 

Aber es immer noch nicht funktioniert, wie ich ein {__NSArrayM} Objekt erhalte, die ich nicht weiß, wie man Zugang .

Bin ich auf dem richtigen Weg oder mache ich etwas grundsätzlich falsch?

+0

Das ist ein NSMutableArray. – CrimsonChris

+0

Ist die Objc-Version, 'CGWindowListCopyWindowInfo' threadsicher? Oder muss es vom Hauptthread laufen? – Noitidart

Antwort

16

Hier ist ein Beispiel in Swift 2.0, das auch mehrere Optionen demonstriert.

let options = CGWindowListOption(arrayLiteral: CGWindowListOption.ExcludeDesktopElements, CGWindowListOption.OptionOnScreenOnly) 
    let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0)) 
    let infoList = windowListInfo as NSArray? as? [[String: AnyObject]] 
6

Verwenden Sie takeUnretainedValue() oder takeRetainedValue() auf windowList.

Check out Apples Using Swift with Cocoa and Objective-C und lesen Sie den Abschnitt Arbeiten mit Cocoa-Datentypen genannt und suchen nach Unmanaged Objekte.

Hier ist ein konkretes Beispiel:

import Cocoa 

let windowInfosRef = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowID(0)) 
let windowInfos = windowInfosRef.takeRetainedValue().__conversion() // cast to swift dictionary 
println(windowInfos) // print the swift dictionary 
1

Hier ist meine Version für Swift 1.2. Es ist expliziter über Typen, da wir wissen, dass die Funktion ein Array von Wörterbüchern mit Zeichenfolgenschlüsseln zurückgibt.

let options = CGWindowListOption(kCGWindowListOptionOnScreenOnly) 
let cfInfoList = CGWindowListCopyWindowInfo(options, CGWindowID(0)).takeRetainedValue() 
let infoList = cfInfoList as NSArray as? [[String: AnyObject]]