【问题标题】:Carbon Accessibility API - Getting windows information across spacesCarbon Accessibility API - 跨空间获取窗口信息
【发布时间】:2010-04-20 14:58:26
【问题描述】:

我想以编程方式解决以下(次要)问题。每当我从笔记本电脑上拔下辅助显示器时,每个窗口都会移动到现在更小的分辨率下可见。当我重新插入外接显示器时,我需要手动将窗户更换到正确的位置。我每天早上都必须这样做(叹息)。

现在我决定编写一个简单的命令行程序,它可以保存每个打开的窗口的位置,并在我想恢复它们的位置时重新定位它们。

通过使用 Accessibility API,我已经成功地完成了一些工作,它允许我控制不属于我的进程空间的窗口。但是我有一个问题:程序只能看到我当前空间中的窗口(我在这里谈论的是 OSX 空间功能)。

换句话说,当我运行程序保存窗口位置时,它只能保存我当前所在空间中的窗口位置。

关于我的程序的更多细节:

  • 它遍历所有正在运行的进程并获取它们的 PID。
  • 它根据这些 PID (AXUIElementCreateApplication) 创建应用程序元素
  • 它获取与此应用程序关联的窗口,然后是它们的位置

当从应用元素获取windows元素时,AXUIElementCopyAttributeValues只返回当前空间的windows。

现在,有没有办法控制任何窗口(跨不同空间)?如果不是,我不介意以编程方式更改空间来获取每个窗口,但这似乎是不可能的。

任何帮助将不胜感激!

【问题讨论】:

    标签: windows cocoa accessibility spaces


    【解决方案1】:

    我不知道有记录的切换空间的方法。

    您可能想要CGSPrivate.h - CGSSetWorkspace 等。请记住,这些函数是 SPI,即使在 10.6.x 版本中也可能在没有警告的情况下中断。

    【讨论】:

      【解决方案2】:

      如果您想避免使用私有 API,您可以利用 Mission Control 具有用于移动到各种空间的键盘快捷键这一事实,并且您可以通过编程方式发送密钥代码来激活它们。我为我一直在开发的名为 Amethyst 的平铺窗口管理器写了一篇关于它的博客文章 (http://ianyh.com/blog/2013/06/05/accessibility/),其中包含一些示例代码,您可以在 -[AMWindow moveToSpace:] 中查看。

      简短的版本正在移动到一个空间,看起来就像使用默认的ctrl + arrow key 移动到相邻的空间:

      CGEventRef keyboardDownEvent = CGEventCreateKeyboardEvent(NULL, kVK_RightArrow, true);
      CGEventRef keyboardUpEvent = CGEventCreateKeyboardEvent(NULL, kVK_RightArrow, false);
      
      CGEventSetFlags(keyboardDownEvent, kCGEventFlagMaskControl);
      CGEventSetFlags(keyboardUpEvent, 0);
      
      CGEventPost(kCGHIDEventTap, keyboardDownEvent);
      CGEventPost(kCGHIDEventTap, keyboardUpEvent);
      
      CFRelease(keyboardEvent);
      CFRelease(keyboardEventUp);
      

      您可以将其与NSWorkspaceActiveSpaceDidChangeNotification 结合使用以遍历所有空间并收集窗口数据。

      另外,作为一个潜在的有趣说明,可访问性 API 实际上可以同时为您提供跨所有空间的窗口,但它只会为您提供自启动使用 API 的进程以来您已遍历到的空间中的窗口。我不知道为什么会这样,但似乎确实如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多