2014-06-07 25 views
10

Jak mogę uzyskać listę wszystkich okien, aktualnie na ekranie, w swift? (Przykłady są poprzedzone import Cocoa)Jak szybko wyświetlić listę wszystkich okien na ekranie?

W celem C można wykonać następujące kod powodzeniem:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 

ale po uruchomieniu odpowiednika w szybkiej (stosując zabaw na test) :

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID) 

Otrzymuję komunikat o błędzie informujący, że mam Use of unresolved identifier 'kcGNullWindowID'.

Po zabawy z pomocą quartz documentation na chwilę Dostałem do:

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

Ale to nadal nie działa jak mam otrzymaniu {__NSArrayM} przedmiot, który nie wiem, jak uzyskać dostęp .

Czy jestem na dobrej drodze, czy też robię coś zasadniczo nie tak?

+0

To jest NSMutableArray. – CrimsonChris

+0

Czy wersja objc, wątek 'CGWindowListCopyWindowInfo' jest bezpieczna? Lub czy musi działać z głównego wątku? – Noitidart

Odpowiedz

16

Oto przykład w Swift 2.0, który demonstruje również wiele opcji.

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

Użyj takeUnretainedValue() lub takeRetainedValue() na windowList.

Wyjazd Apple Using Swift with Cocoa and Objective-C i przeczytać rozdział o nazwie Praca z typami danych Kakao i szukać niezarządzalny Objects.

Oto konkretny przykład:

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

Oto moja wersja dla Swift 1.2. Mówimy bardziej szczegółowo o typach, ponieważ wiemy, że funkcja zwraca tablicę słowników z kluczami łańcuchowymi.

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