如何在swift中获取当前屏幕上所有窗口的列表?

时间:2014-06-07 06:18:27

标签: objective-c cocoa quartz-graphics swift

如何在 swift 中获取当前屏幕上所有窗口的列表? (所有示例都以import Cocoa

开头

objective-c 中,我可以成功运行以下代码:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

但是当我在 swift 中运行等效物时(使用游乐场进行测试):

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID)

我收到错误,告诉我我有Use of unresolved identifier 'kcGNullWindowID'

quartz documentation的帮助下玩了一段时间后,我得到了:

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

但它仍然不起作用,因为我收到一个{__NSArrayM}对象,我不知道如何访问。

我是在正确的轨道上还是我做了一些根本错误的事情?

3 个答案:

答案 0 :(得分:21)

这是Swift 2.0中的一个示例,它还演示了多个选项。

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

答案 1 :(得分:6)

takeUnretainedValue()上使用takeRetainedValue()windowList

查看Apple的Using Swift with Cocoa and Objective-C并阅读名为使用Cocoa数据类型的部分,并查找非托管对象

这是一个具体的例子:

import Cocoa

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

答案 2 :(得分:1)

这是我的Swift 1.2版本。它更明确的类型,因为我们知道函数返回一个带字符串键的字典数组。

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