MacOS - 根据给定的窗口 ID 激活窗口

Ans*_*rma 5 macos cocoa core-graphics objective-c swift

是否可以根据返回的值激活(置于前台)窗口CGWindowListCopyWindowInfo?(即使用窗口 ID ( kCGWindowNumber) 或其他内容。)

编辑:

我应该指定我的应用程序(将使用辅助功能运行)需要能够为其他应用程序的窗口执行此操作。

自从发布问题以来我发现了AXUIElementPerformAction。我的方向正确吗?

或者在我的代码中运行 AppleScript 桥是最好的方法吗?

Mik*_*hke 3

您可以通过 pid 附加到进程并获取其窗口。然后使用kAXRaiseAction将它们带到前面,如下所示:

AXUIElementRef element = AXUIElementCreateApplication(pid);
if (element) {
  CFArrayRef array;
  AXUIElementCopyAttributeValues(element, kAXWindowsAttribute, 0, 99999, &array);

  if (array == nullptr)
    return;

  NSArray *windows = (NSArray *)CFBridgingRelease(array);
  for (NSUInteger i = 0; i < windows.count; ++i) {
    AXUIElementRef ref = (__bridge AXUIElementRef)(windows[i]);
    AXError error = AXUIElementPerformAction(ref, kAXRaiseAction);
    // handle error
  }
}

CFRelease(element);
Run Code Online (Sandbox Code Playgroud)

无需释放arraywindows. 数组中的子元素会被自动处理,并且数组会桥接到 ARC 释放的 NSArray。