Mac/Cocoa - 使用Accessibility API获取窗口列表

Ben*_*ard 6 cocoa accessibility

我想使用Accessibility API获取给定应用程序(外部)的所有窗口的列表.

目标是检查某个窗口是否打开.首先,我检查应用程序是否正在运行(使用[NSWorkspace runningApplications]并检查每个应用程序),然后我想检查为该应用程序打开的每个窗口的标题栏文本.

PS

所以我可以使用PID为app创建一个元素:

AXUIElementRef app = AXUIElementCreateApplication(pid);
Run Code Online (Sandbox Code Playgroud)

但我该怎么办呢?我是否朝着正确的方向前进?不能相信它很难找到这方面的例子.

Tho*_*ing 12

我不知道从Accessibility API获取窗口ID和PID的方法.
Laurent提到的NSWindow方法仅提供窗口ID,但不提供窗口拥有应用程序的PID.
我会使用自10.5以来可用的CGWindowList方法.
要获取窗口ID列表和所有者的PID,您可以尝试以下操作:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
for (NSMutableDictionary* entry in (NSArray*)windowList) 
{
    NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
    NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue];
    NSLog(@"%@:%d", ownerName, ownerPID);
}
CFRelease(windowList);  
Run Code Online (Sandbox Code Playgroud)

您可以使用选项参数控制是否需要所有窗口(包括屏幕外...).
入口对象还包含更多信息. 文档链接


Pet*_*sey 3

用于AXUIElementCopyAttributeValues复制 的值kAXWindowsAttribute,该值应该是代表应用程序窗口的 AXUIElement 对象的数组。

从它的函数名就可以猜到,它遵循复制规则