可可可访问性 API 和空间?

Win*_*wer 4 cocoa accessibility spaces

我正在编写的应用程序 ( http://code.google.com/p/blazingstars/issues/detail?id=25 )遇到问题,其中我的程序是一个 menulet(菜单栏)应用程序,它使用与另一个程序交互和控制另一个程序的辅助功能 API。我做一些通常的事情,比如注册 API 通知和通过 API 调用获取窗口列表等,但我不久前意识到,如果我的程序在我正在交互的程序之后的第二个空间(虚拟桌面)中启动with 是在第一个启动的,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(有没有办法解决我遗漏的问题?)

一个简单的解决方案是弹出一个对话框,要求用户在正确的空间中重新启动程序,但在我的一生中,我无法弄清楚如何通过 NSWorkspace 或 Accessibility API 来判断我的目标所在的空间,以便我可以将它与我所在的空间进行比较。有什么想法吗?

请注意,将收集行为设置为 NSWindowCollectionBehaviorCanJoinAllSpaces 对我没有任何好处,因为我必须在启动时做大量工作,所以我必须从一开始就与目标处于同一空间。

Lei*_*tzn 5

我认为您可以使用CGWindow.h..
具体见CGWindowListCopyWindowInfo()kCGWindowWorkspace

我已经使用这些 API 来做所有类型的事情,比如获取窗口内容、窗口框架等......

如果这不起作用,那么您可能想尝试这个私有 API:

 extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid,
                                       CGSWindowID wid,
                                       CGSWorkspaceID *workspace);
Run Code Online (Sandbox Code Playgroud)

诀窍是获取目标进程的连接 ID。