How can I get a list of all windows, currently on the screen, in swift? (all examples are preceded by import Cocoa
)
In objective-c I can run the following code successfully:
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
But when I run the equivalent in swift(using the playground to test):
let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID)
I get an error telling me that I have an Use of unresolved identifier 'kcGNullWindowID'
.
After playing around with the help of the quartz documentation for a while I have gotten to:
let windowList = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowListOption(0))
But it still does not work as I am receiving a {__NSArrayM}
object, which I do not know how to access.
Am I on the right track or am I doing something fundamentally wrong?
Here's an example in Swift 2.0, which also demonstrates multiple options.
let options = CGWindowListOption(arrayLiteral: CGWindowListOption.ExcludeDesktopElements, CGWindowListOption.OptionOnScreenOnly)
let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
let infoList = windowListInfo as NSArray? as? [[String: AnyObject]]
Use takeUnretainedValue()
or takeRetainedValue()
on windowList
.
Check out Apple's Using Swift with Cocoa and Objective-C and read the section called Working with Cocoa Data Types and look for Unmanaged Objects.
Here is a concrete example:
import Cocoa
let windowInfosRef = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowID(0))
let windowInfos = windowInfosRef.takeRetainedValue().__conversion() // cast to swift dictionary
println(windowInfos) // print the swift dictionary
Here's my version for Swift 1.2. It's more explicit about types, since we know the function returns an array of dictionaries with string keys.
let options = CGWindowListOption(kCGWindowListOptionOnScreenOnly)
let cfInfoList = CGWindowListCopyWindowInfo(options, CGWindowID(0)).takeRetainedValue()
let infoList = cfInfoList as NSArray as? [[String: AnyObject]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With