【问题标题】:How can I get a list of all windows, currently on the screen, in swift?如何快速获取当前屏幕上所有窗口的列表?
【发布时间】:2014-07-28 11:08:40
【问题描述】:

如何在 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} 对象,我不知道如何访问它。

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

【问题讨论】:

  • 这是一个 NSMutableArray。
  • objc版本CGWindowListCopyWindowInfo线程安全吗?还是必须从主线程运行?

标签: objective-c cocoa quartz-graphics swift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    windowList 上使用takeUnretainedValue()takeRetainedValue()

    查看 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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 1970-01-01
        • 2020-04-05
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多