我正在编写的一个应用程序(http://code.google.com/p/blazingstars/issues/detail?id=25)遇到了一个问题,其中我的程序是一个menulet (菜单栏)应用程序,它使用可访问性API与另一个程序交互并控制另一个程序。我做了一些常见的事情,如注册API通知和通过API调用获取窗口列表等,但我不久前意识到,如果我的程序在与我交互的程序在第一个Space (虚拟桌面)中启动后在第二个Space(虚拟桌面)中启动,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(我遗漏了这个问题,有什么办法可以解决吗?)
一个简单的解决方案是弹出一个对话框,要求用户在正确的空间中重新启动程序,但在我的一生中,我不知道如何通过NSWorkspace或可访问性API来辨别我的目标所在的空间,以便我可以将其与我所在的空间进行比较。有什么想法吗?
请注意,将收集行为设置为NSWindowCollectionBehaviorCanJoinAllSpaces对我没有任何好处,因为我必须在启动时做大量工作,因此我必须从一开始就与目标处于同一空间。
发布于 2010-01-21 09:03:22
我认为您可以使用CGWindow.h.中的API来实现这一点。
具体来看CGWindowListCopyWindowInfo()和kCGWindowWorkspace。
我已经使用这些API来做所有类型的事情,比如获取窗口内容、窗口框架等。
如果这不起作用,那么您可能想要尝试这个私有API:
extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid,
CGSWindowID wid,
CGSWorkspaceID *workspace);诀窍是获取目标进程的连接ID。
发布于 2010-01-19 12:21:30
您可能应该重新设计您的应用程序,以便它延迟初始化,直到您想要控制的应用程序位于当前空间中。
在Leopard下没有简单的方法来做到这一点,因为没有官方的“空间变化”通知,但this page上的博客帖子和评论可能会有所帮助。
https://stackoverflow.com/questions/2089852
复制相似问题