如何使用 swift 从 core-grapics API 获取窗口列表

2024-05-06

我正在尝试使用 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 https://developer.apple.com/library/mac/documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html

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

import Cocoa
import CoreFoundation

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

let info = CGWindowListCopyWindowInfo(option, relativeToWindow)

但 XCode (playground) 告诉我

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

我在这里做错了什么?


  • kCGWindowListOptionOnScreenOnly is an Int, 你必须convert那个到CGWindowListOption aka UInt32.
  • C 定义

    #define kCGNullWindowID ((CGWindowID)0) 
    

    没有导入到 Swift 中,因此你必须使用常量0.

  • 此外,CGWindowListCopyWindowInfo()返回一个Unmanaged<CFArray>!,因此你必须打电话takeRetainedValue()关于返回值(如记录“使用 Cocoa 数据类型” https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html).

一起:

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 {
        // ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 swift 从 core-grapics API 获取窗口列表 的相关文章

随机推荐

  • 来自 RAZOR 中不同文件夹的 RenderPartial

    我一直在尝试将我的 aspx 页面转换为 cshtml 并且在从另一个文件夹渲染部分页面时遇到问题 我以前做过的事 我认为等价的是 Html RenderPartial Views Inquiry InquiryList cshtml Mo
  • Django 1.7.1 需要字段的默认值 - 但数据库中没有条目。为什么?

    我遇到了一个奇怪的问题 我在 Mac OS X Yosemite 上使用 Django 1 7 1 并且配置了本地 MySQL 数据库 通常 我创建一个模型 如果我想添加另一个字段 我只需做一个 manage py migrateDjang
  • asp:GridView 控件的 EditTemplate 属性

    我有一个 asp GridView 其中有两列 在一列中我想显示标签 但是当我单击 sdit 按钮时 我想在该特定列中显示一个下拉列表 我创建了如下网格视图
  • 使用与后期步骤中的 Shell 脚本中的克隆相同的 http git 凭据

    我想要自动化我们的发布过程 并且我有一个 Maven 项目的以下 Jenkins 构建作业 使用配置的 Jenkins 凭证 用户名 密码 克隆 Git 存储库 执行一些 Maven 命令以进行构建 配置一个后步骤来执行一些额外的 Git
  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • 为什么我无法将子窗格 plist 文件添加到项目的 Settings.bundle 中?

    我正在运行 Xcode 4 1 并且一直在关注有关应用程序设置的教程 一切都进展顺利 直到我准备好为我想要添加的子窗格添加 plist 我正在观看的视频教程 也使用 Xcode 4 1 显示该人右键单击 settings bundle 并选
  • 在pycharm中使用多处理时如何调试

    我正在 pycharm 社区版中使用 anaconda2 调试多进程程序 它有几个后台工作进程 工作进程将检查输入队列以检索任务 而不会休眠 直到收到任务 事实上 我只对主要流程感兴趣 但是pycharm调试器总是单步进入子进程 看起来主进
  • 如何在JavaFX中获得一个小的ProgressBar

    我正在尝试获得一个类似 iTunes 的进度条 该进度条非常小 高度约为 5 像素 但我似乎无法低于 19 或 20 像素 我尝试在周围的窗格上设置 fx max height 但没有效果 请注意 这个值确实会改变高度 我只是不能让它小于大
  • curl 在命令行中工作正常,但在 php 中不行

    我使用curl 从 PHP 中检索 url 的内容 它适用于大多数 url 但对于某些 url 它只返回一个空字符串 从命令行 卷曲 此类 url 效果很好 这是我运行curl的方式 curl session curl init site
  • ActiveX 无法在客户端计算机上运行

    我正在尝试为一个简单的 hello world 消息框运行 activex 控件 首先 我创建了类库 现在有了 dll 然后我创建了 HTML 页面并调用了 activeX 控件
  • db2:使用不同表上的选择更新多行和字段

    对于 A 的所有行 其中 A x B z 是否可以使用不同表 B c B d 的值 c 和 d 来增加表 A a 和 A b 的字段 a 和 b 我对这个查询感到疯狂 DB2 和 SQL 标准在 UPDATE 语句中没有 FROM 子句 所
  • 如何使用 InstallShield 限量版创建单个 setup.exe?

    我正在尝试创建一个 exe 文件安装程序 我设法将所有依赖项放入 exe 文件中 通过设置从 Setup exe 属性中提取 如何在 setup exe 文件中获取 msi 这就是现在的样子 我也有这个烦恼 在我看来 它的做法非常不直观 突
  • 单机Octave并行计算——包和示例

    我想在单台机器 而不是集群 上并行化 Octave 中的 for 循环 前段时间我问了一个关于Octave并行版本的问题Octave并行计算 https stackoverflow com questions 7047840 paralle
  • 可以使用多个数据库连接

    tSQLt 世界的新手 很棒的工具集 在我正在为其设置测试的存储过程中遇到了一个小问题 如果由于某种原因我有一个连接到多个数据库甚至多个 SQL 服务器 链接服务器 的存储过程 在这种情况下是否可以使用 tSQLt 进行单元测试 我已经评论
  • PHPQuery WebBrowser 插件 - 使用 cookies

    我正在尝试使用 PHPQuery 的 WebBrowser 插件登录网站 我能够成功登录 但我不确定如何重用上一次调用中的 cookie 到下一次调用 client phpQuery browserGet https website com
  • 能够存储微秒的 Date 对象

    我正在寻找一个能够存储到微秒粒度的 Date 对象 有人知道吗 标准Date对象仅存储到毫秒 我知道这是平台限制 我可以通过包装来解决这个问题Date加上自定义类别中的小数数量 然而 我希望避免编写一个带有适当计算等的内容 我需要解析一个b
  • Mysql Workbench 无法选择外键

    首先 我检查了很多问题并用谷歌搜索了很多 但没有一个解决我的问题 我正在使用 Mysql Workbench 6 3 创建表 我仅使用 gui 而不是单个查询来创建它们 之后我尝试创建一些外键int 11 列 但 GUI 不允许我这样做 这
  • 如何最高效地更新MongoDB中的大量文档?

    我想要最有效地更新大量 gt 100 000 文档 我的第一个天真的方法是在 JS 级别上进行 编写脚本 首先获取 ids 然后循环 ids 并通过 id 调用更新 完整 文档或 set 补丁 我遇到了内存问题 还将数据分成了最大块 500
  • Pandas 数据框列总和并收集结果

    给定以下数据框 import pandas as pd p1 name willy age 11 interest Lego p2 name willy age 11 interest games p3 name zoe age 9 int
  • 如何使用 swift 从 core-grapics API 获取窗口列表

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