【问题标题】:How to get window list from core-grapics API with swift如何使用 swift 从 core-grapics API 获取窗口列表
【发布时间】:2015-05-19 21:48:11
【问题描述】:

我正在尝试使用 Swift 从核心图形 API 获取 OSX 上的窗口列表(以便稍后捕获它们的图像)。经过一番研究,我发现 CGWindowListCopyWindowInfo Objective-C API 调用具有以下签名:

CFArrayRef CGWindowListCopyWindowInfo(
   CGWindowListOption option,
   CGWindowID relativeToWindow
);

参数

option:描述哪些窗口字典的选项 返回。典型选项让您返回所有窗口的字典或 对于在指定窗口上方或下方的窗口 相对窗口参数。有关详细信息,请参阅窗口列表 选项常数。

relativeToWindow:用作窗口的 ID 确定要使用哪些其他窗口字典时的参考点 返回。对于不需要参考窗口的选项,这 参数可以是kCGNullWindowID。

https://developer.apple.com/library/mac/documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html

在我的 swift 应用程序中,我尝试像这样使用它:

import Cocoa
import CoreFoundation

let option: CGWindowListOption = kCGWindowListOptionOnScreenOnly
let relativeToWindow: CGWindowID = kCGNullWindowID

let info = CGWindowListCopyWindowInfo(option, relativeToWindow)

但是 XCode(游乐场)告诉我

  • 它不能使用 int 作为 CGWindowListOption (kCGWindowListOptionOnScreenOnly == 0)
  • kCGNullWindowID 是一个未解析的标识符

我在这里做错了什么?

【问题讨论】:

  • 请注意,这不是一个 Objective-C API。这是一个 C API。 (这并没有太大变化;但它会改变您查找信息的位置。)

标签: macos swift core-graphics


【解决方案1】:
  • kCGWindowListOptionOnScreenOnlyInt,你必须转换 CGWindowListOption 又名 UInt32
  • C 定义

    #define kCGNullWindowID ((CGWindowID)0) 
    

    不会导入 Swift,因此您必须使用常量 0.

  • 另外,CGWindowListCopyWindowInfo() 返回一个Unmanaged<CFArray>!,因此你必须调用takeRetainedValue() 返回值(如 "Working with Cocoa Data Types" 中所述)。

一起:

let option = CGWindowListOption(kCGWindowListOptionOnScreenOnly)
let relativeToWindow = CGWindowID(0)
let info = CGWindowListCopyWindowInfo(option, relativeToWindow).takeRetainedValue()

然后你可以枚举这个字典数组

for dict in info as! [ [ String : AnyObject] ] {
    // ...
}

Swift 3 更新:

if let info = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [[ String : Any]] {
    for dict in info {
        // ...
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2019-03-29
  • 2019-02-05
  • 2021-04-29
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多