如何在 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}
对象,我不知道如何访问。
我是在正确的轨道上还是我做了一些根本错误的事情?
答案 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]]