Cocoa可访问性API和空间?
我正在编写的一个应用程序()遇到了一个问题,我的程序是一个menulet(菜单栏)应用程序,它使用可访问性API与另一个程序交互并控制另一个程序。我通常会做一些事情,比如注册API通知,通过API调用获取窗口列表等,但我不久前意识到,如果我的程序在第一个空间启动后在第二个空间(虚拟桌面)启动,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(有没有办法解决我遗漏的问题?) 一个简单的解决方案是弹出一个对话框,要求用户在正确的空间中重新启动程序,但就我的一生而言,我不知道如何通过NSWorkspace或Accessibility API判断目标所在的空间,以便将其与我所在的空间进行比较。有什么想法吗Cocoa可访问性API和空间?,cocoa,accessibility,spaces,Cocoa,Accessibility,Spaces,我正在编写的一个应用程序()遇到了一个问题,我的程序是一个menulet(菜单栏)应用程序,它使用可访问性API与另一个程序交互并控制另一个程序。我通常会做一些事情,比如注册API通知,通过API调用获取窗口列表等,但我不久前意识到,如果我的程序在第一个空间启动后在第二个空间(虚拟桌面)启动,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(有没有办法解决我遗漏的问题?) 一个简单的解决方案是弹出一个对话框,要求用户在正确的空间中重新启动程序,但就我的一生而言,我不知道如何通过NSWo
请注意,将收集行为设置为NSWindowCollectionBehaviorCanJoinAllSpaces对我没有任何好处,因为我在启动时必须做大量工作,因此我必须从一开始就与目标在同一个空间 您可能应该重新设计您的应用程序,使其延迟初始化,直到您想要控制的应用程序位于当前空间
在Leopard下没有简单的方法可以做到这一点,因为没有官方的“空间更改”通知,但上的博客帖子和评论可能会有所帮助。我想你可以通过
CGWindow.h中的API来做到这一点。
具体请参见
CGWindowListCopyWindowInfo()
和kCGWindowWorkspace
我用这些API做了各种各样的事情,比如获取窗口内容、窗口框架等等
如果这不起作用,那么您可能希望尝试以下私有API:
extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid,
CGSWindowID wid,
CGSWorkspaceID *workspace);
诀窍是获取目标进程的连接ID。Rob,这或多或少是我想要做的(我将实际退出,直到用户同时启动这两个程序)。但是,除非我遗漏了什么,否则你链接到的博客帖子不会回答我的问题:我如何判断另一个应用程序(不是我自己的)在哪个空间?啊,我明白你的意思。我不确定这是否可能,我很确定这在公共API中是不可能的。这对我来说是最好的选择。我真的很讨厌使用这些API,但我想我必须接受它。:-)谢谢,莱博维森。