2010-01-18 48 views
3

我正在写一个应用程序的问题(http://code.google.com/p/blazingstars/issues/detail?id=25),其中我的程序是一个使用Accessibility API与另一个程序进行交互和控制的菜单栏(菜单栏)应用程序。我会做一些常见的事情,比如注册API通知并通过API调用获取窗口列表等,但是我前一段时间意识到如果我的程序在我正在交互的程序之后的第二个空间(虚拟桌面)中启动与第一次启动,我的程序将崩溃并烧毁,因为它无法访问任何有关其目标的信息。 (有没有办法绕过这个问题,我失踪了?)可可易用性API和空间?

一个简单的解决方案是弹出一个对话框,要求用户在正确的空间重新启动程序,但对于我的生活,我无法图了解如何通过NSWorkspace或Accessibility API知道我的目标所在的空间,以便我可以将其与我所在的空间进行比较。任何想法?

请注意,将集合行为设置为NSWindowCollectionBehaviorCanJoinAllSpaces不会对我有任何好处,因为我必须在启动时执行一些工作,所以我必须从一开始就与目标位于同一空间。

回答

4

我想你可以用CGWindow.h.中的API来做到这一点。
具体参见CGWindowListCopyWindowInfo()kCGWindowWorkspace

我使用这些API做的所有类型的东西,喜欢把自己的窗口内容,窗框等...

如果不工作,那么你可能想试试这个私有API:

extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid, 
             CGSWindowID wid, 
             CGSWorkspaceID *workspace); 

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

+0

这听起来像对我来说是最好的镜头。我*真的很讨厌使用这些API,但我想我必须把它吸引过来。 :-)谢谢,Leibowitzn。 – Winawer 2010-01-21 19:04:53

0

您应该重新设计您的应用程序,以便延迟其初始化,直到您要控制的应用程序位于当前空间中。

在Leopard下没有简单的方法可以做到这一点,因为没有官方的“空间变更”通知,但博客文章和有关this page的评论可能会有所帮助。

+0

Rob, 这或多或少是我想要做的(我将实际退出,直到用户开始两个程序在一起)。但是除非我错过了一些东西,否则链接到的博客帖子不会回答我的问题:我如何知道另一个* app(不是我自己的)所在的空间? – Winawer 2010-01-19 20:55:18

+0

啊,我明白你的意思了。我不确定这是否有可能,但我非常确定这对于公共API来说是不可能的。 – 2010-01-20 03:03:44