2014-06-07 56 views
10

如何获得当前在屏幕上的所有窗口的列表swift? (所有实施例是通过import Cocoa开头)如何获得当前屏幕上的所有窗口清单?

目标c我可以运行成功以下代码:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 

但是当我运行在迅速等效(使用操场进行测试) :

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID) 

我得到一个错误,告诉我我有一个Use of unresolved identifier 'kcGNullWindowID'

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

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

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

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

+0

这是一个NSMutableArray。 – CrimsonChris

+0

是objc版本,'CGWindowListCopyWindowInfo'线程安全吗?还是必须从主线程运行? – Noitidart

回答

16

下面是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]] 
6

windowList上使用takeUnretainedValue()takeRetainedValue()

退房苹果的Using Swift with Cocoa and Objective-C和阅读称为部分与可可数据类型合作,并期待为非托管对象

这里是一个具体的例子:

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

这里是我的版本为1.2雨燕。它对类型更加明确,因为我们知道函数返回一个包含字符串键的字典数组。

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