4

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

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

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

4

2 回答 2

5

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

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

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

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

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

于 2010-01-21T01:03:21.990 回答
0

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

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

于 2010-01-19T04:21:29.873 回答