使用辅助功能选项在OSX中移动应用程序窗口

时间:2014-04-07 18:51:37

标签: objective-c macos accessibility accessibility-api

我正在尝试使用辅助功能API在OSX中移动其他应用程序。我实际上有这个工作。但我遇到了一个重大问题。

AXUIElementRef appRef = AXUIElementCreateApplication(self.pid);

这使用我的应用程序的PID来稍后移动窗口。我发现多个窗口具有相同的PID,当我尝试移动应用程序的第二个窗口时,我的应用程序崩溃了。

我可以使用WindowID移动我的应用程序吗?

1 个答案:

答案 0 :(得分:0)

如果您确实需要,唯一标识特定窗口的方法是浏览CGWindowListCopyWindowInfo的结果,以选择与您在appRef处使用的pid匹配的结果;然后kCGWindowNumber CFNumber是该窗口的Quartz独特的CGWindowID。

然而,听起来你更有可能只是错误地通过窗口索引。这适用于您的appRef

CFArrayRef windows;
AXUIElementCopyAttributeValue(appRef, kAXWindowsAttribute, (CFTypeRef*)&windows);
int windowCount = windows ? CFArrayGetCount(windows) : 0;
for (int windowIndex = 0; windowIndex < windowCount; windowIndex++)
{
    AXUIElementRef windowRef = (AXUIElementRef)CFArrayGetValueAtIndex(windows, windowIndex);
    ... move windowRef here ...
}

如果这不能解决问题,请发布崩溃的代码以及崩溃的代码。