How can I get a list of all windows, currently on the screen, in swift?

不问归期 提交于 2019-11-27 05:49:35

问题


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?


回答1:


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]]



回答2:


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



回答3:


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]]


来源:https://stackoverflow.com/questions/24094375/how-can-i-get-a-list-of-all-windows-currently-on-the-screen-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!