Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa可访问性API和空间?_Cocoa_Accessibility_Spaces - Fatal编程技术网

Cocoa可访问性API和空间?

Cocoa可访问性API和空间?,cocoa,accessibility,spaces,Cocoa,Accessibility,Spaces,我正在编写的一个应用程序()遇到了一个问题,我的程序是一个menulet(菜单栏)应用程序,它使用可访问性API与另一个程序交互并控制另一个程序。我通常会做一些事情,比如注册API通知,通过API调用获取窗口列表等,但我不久前意识到,如果我的程序在第一个空间启动后在第二个空间(虚拟桌面)启动,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(有没有办法解决我遗漏的问题?) 一个简单的解决方案是弹出一个对话框,要求用户在正确的空间中重新启动程序,但就我的一生而言,我不知道如何通过NSWo

我正在编写的一个应用程序()遇到了一个问题,我的程序是一个menulet(菜单栏)应用程序,它使用可访问性API与另一个程序交互并控制另一个程序。我通常会做一些事情,比如注册API通知,通过API调用获取窗口列表等,但我不久前意识到,如果我的程序在第一个空间启动后在第二个空间(虚拟桌面)启动,我的程序将崩溃并烧毁,因为它无法访问有关其目标的任何信息。(有没有办法解决我遗漏的问题?)

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


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

您可能应该重新设计您的应用程序,使其延迟初始化,直到您想要控制的应用程序位于当前空间


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

我想你可以通过
CGWindow.h中的API来做到这一点。

具体请参见
CGWindowListCopyWindowInfo()
kCGWindowWorkspace

我用这些API做了各种各样的事情,比如获取窗口内容、窗口框架等等

如果这不起作用,那么您可能希望尝试以下私有API:

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

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

Rob,这或多或少是我想要做的(我将实际退出,直到用户同时启动这两个程序)。但是,除非我遗漏了什么,否则你链接到的博客帖子不会回答我的问题:我如何判断另一个应用程序(不是我自己的)在哪个空间?啊,我明白你的意思。我不确定这是否可能,我很确定这在公共API中是不可能的。这对我来说是最好的选择。我真的很讨厌使用这些API,但我想我必须接受它。:-)谢谢,莱博维森。