来自AXUIElement的CGWindowID

Sam*_*ami 6 macos cocoa automation macos-carbon

我正在尝试使用辅助功能API自动化外部OSX应用程序.应用程序的某些状态不能通过API获得,因此我通过屏幕抓取获取它.为此,我需要为具有"窗口角色"的辅助功能对象获取CGWindowID.

有没有直接的方法来获取"窗口角色"可访问性对象的CGWindowID?通过匹配窗口的各种属性,例如大小,标题和位置,我可以启发式地获得它,但这真的很糟糕,如果我的应用程序也支持极端情况我会感觉更好,即使它们不太可能.

mjm*_*jmt 8

从至少Leopard开始有一个函数(从10.7.3开始):

extern "C" AXError _AXUIElementGetWindow(AXUIElementRef, CGWindowID* out);
Run Code Online (Sandbox Code Playgroud)

关于使用这样的东西的常见警告虽然适用.它可能会在下次操作系统更新时立即更改!

  • 这仍然有效吗?我将如何从 Swift 使用它?我尝试并收到错误“使用未解析的标识符'_AXUIElementGetWindow'” (3认同)

Ben*_*itz 4

\xe2\x80\x99s 没有办法做到这一点;可访问性层次结构与实际窗口/视图层次结构完全解耦。我认为你的搭配效果最好。

\n

  • 感谢你的回答。我已经怀疑过这一点,但很高兴有人证实这一点。无论如何,我的匹配逻辑通过位置和大小匹配足以满足我的目的,以及一些用于在发生冲突时向左/右/上/下移动窗口像素的附加逻辑。 (2认同)