2014-06-07 2 views
10

Comment puis-je obtenir une liste de toutes les fenêtres, actuellement à l'écran, dans swift? (Tous les exemples sont précédés d'import Cocoa)Comment puis-je obtenir une liste de toutes les fenêtres, actuellement à l'écran, dans swift?

Je peux en objective-c exécuter le code suivant avec succès:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 

Mais quand je lance l'équivalent en rapide (en utilisant le terrain de jeu pour tester) :

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID) 

Je reçois une erreur me disant que j'ai un Use of unresolved identifier 'kcGNullWindowID'.

Après avoir joué avec l'aide de la quartz documentation pendant un certain temps, je l'ai appris à:

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

Mais il ne fonctionne toujours pas comme je reçois un objet {__NSArrayM}, que je ne sais pas comment accéder . Suis-je sur la bonne voie ou suis-je en train de faire quelque chose de fondamentalement faux?

+0

C'est un NSMutableArray. – CrimsonChris

+0

La version d'objc, le thread 'CGWindowListCopyWindowInfo' est-il sûr? Ou doit-il fonctionner à partir du thread principal? – Noitidart

Répondre

16

Voici un exemple dans Swift 2.0, qui montre également plusieurs options.

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

Utilisez takeUnretainedValue() ou takeRetainedValue() sur windowList.

Découvrez Apple Using Swift with Cocoa and Objective-C et lisez la section intitulée Utilisation des types de données Cocoa et chercher objets non gérés.

Voici un exemple concret:

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

Voilà ma version pour Swift 1.2. C'est plus explicite sur les types, puisque nous savons que la fonction renvoie un tableau de dictionnaires avec des clés de chaîne.

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