如何在 Mac OS X 的 Accessibility API 中获取当前键盘焦点坐标?

Mat*_*ams 2 keyboard macos focus accessibility-api

我正在寻找 Mac OS X Accessibility API 来获取当前键盘(而不是鼠标)焦点位置的坐标。根据我在http://www.apple.com/accessibility/pdf/Mac_OS_X_Tiger_vpat.pdf找到的文档的第 2 页,这是可行的:

支持:Mac OS X 通过辅助功能 API 将当前键盘和鼠标焦点的位置公开给辅助技术,并在屏幕上提供焦点的视觉指示。

尽管有上面的声明,我似乎找不到 API 本身。我是一名经验丰富的开发人员(从 1982 年开始编码),但从未在 Mac OS X 上进行过开发;请温柔一点。

Bre*_*McK 5

OSX 似乎有一个非对称的可访问性 API;您可以使用NSAccessibilityProtocol使您自己的应用程序可访问,但要访问另一个应用程序的可访问性,您必须使用一组单独的接口/对象、AXUIElement和朋友。

我找到了一篇关于Retreiving the window that may be used here 的文章:似乎关键步骤是:

  • 使用AXUIElementCreateSystemWide创建“系统范围”可访问性对象
  • 通过调用AXUIElementCopyAttributeValueask for 为当前聚焦的应用程序询问该对象kAXFocusedApplicationAttribute
  • 再次使用 向返回的对象询问聚焦窗口AXUIElementCopyAttributeValue,但这次是NSAccessibilityFocusedWindowAttribute- 实际上看起来您可以跳过下面的这一步,直接从聚焦的应用程序转到聚焦的 UI 元素...
  • 再次使用相同的 API 向返回的对象询问当前聚焦的元素,但这次使用 NSAccessibilityFocusedUIElementAttribute
  • 询问该元素的 kAXSizeAttribute / kAXPositionAttribute

您可能还想查看UIElementInspector的源代码,它显示有关鼠标指针下元素的信息(尽管它似乎没有对焦点执行任何操作)。

看起来您还需要通过 GUI(参见上面的文章)或通过终端启用辅助功能 API 才能使上述任何一项工作 - 大概这是为了让用户防御流氓应用程序控制他们的桌面。

我个人(还)没有使用过这些;但我对可访问性 API 非常熟悉,可以知道在哪里查看 - 希望这会有所帮助。