【问题标题】:Programmatically change order of full screen apps on macOS with AppKit使用 AppKit 在 macOS 上以编程方式更改全屏应用程序的顺序
【发布时间】:2021-07-23 14:24:34
【问题描述】:

我正在尝试构建一个 macOS 实用程序,它允许我以编程方式更改我机器上全屏应用程序的顺序。

例如,假设我机器上的全屏应用目前从左到右排列如下:

  1. iTerm
  2. 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 可以随时更改它而无需任何事先警告,因此您的工作代码可能会随着每次系统更新而中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2014-03-07
      • 2019-10-16
      • 1970-01-01
      相关资源
      最近更新 更多