0

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

AXUIElementRef appRef = AXUIElementCreateApplication(self.pid);

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

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

4

1 回答 1

0

如果您确实需要,唯一标识特定窗口的方法是通过结果CGWindowListCopyWindowInfo来选择与您在appRef那里使用的 pid 匹配的窗口;那么kCGWindowNumberCFNumber 是 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 ...
}

如果这不能使问题变得明显,请发布崩溃的代码以及它是如何崩溃的。

于 2015-01-30T23:50:25.263 回答