【问题标题】:Programmatically change order of full screen apps on macOS with AppKit使用 AppKit 在 macOS 上以编程方式更改全屏应用程序的顺序
【发布时间】:2021-07-23 14:24:34
【问题描述】:
我正在尝试构建一个 macOS 实用程序,它允许我以编程方式更改我机器上全屏应用程序的顺序。
例如,假设我机器上的全屏应用目前从左到右排列如下:
- 铬
- iTerm
- Xcode
我希望能够在 AppKit 中调用一个方法来表达类似“将 Xcode 从全屏索引 2 移动到索引 0”之类的内容。但是,我无法确定可以帮助我执行此操作的 AppKit API。
-
NSScreen 只提供物理显示,不提供全屏应用/空间
-
NSApplication 只给出我的应用程序的窗口列表
-
CGWindowListCopyWindowInfo 看起来很有希望,但它没有关于全屏应用程序顺序的信息。它也不允许我获得 NSWindow 对象来希望更改订单
我正在尝试用 AppKit 做些什么吗?
谢谢!
【问题讨论】:
标签:
macos
cocoa
fullscreen
nswindow
appkit
【解决方案1】:
空间(桌面和全屏应用程序都只是空间)是系统窗口管理器的一项功能,只能由用户通过应用程序Mission Control 进行管理。
当然,窗口管理器需要暴露一个API进行管理,否则Mission Control会如何与之交互呢?但该 API 不公开。
这些私有 API 的反向工程标头可以在网上找到,例如
https://github.com/NUIKit/CGSInternal
有了这些标头,您可以编写如下代码:
#import "CGSInternal/CGSSpace.h"
CGSSpaceID activeSpace =
CGSGetActiveSpace(_CGSDefaultConnection());
NSLog(@"activeSpace: %zu", activeSpace);
CFArrayRef spaceArray =
CGSCopySpaces(_CGSDefaultConnection(), kCGSAllSpacesMask);
NSLog(@"allSpaces: %@", (__bridge id)spaceArray);
但通常的警告适用于这里:
您不能使用私有 API 向 Apple 的 App Store 提交代码。没有官方文档,关于该 API 的所有已知信息都经过了逆向工程,可能并不总是正确的。由于 API 不是公开的,Apple 可以随时更改它而无需任何事先警告,因此您的工作代码可能会随着每次系统更新而中断。