1

当我从石英窗口服务中使用 CGWindowListCreate 时,它​​会生成一个非常长的窗口 ID 数组。我试图打开排除桌面元素的选项,但即使只有 3 或 4 个我称之为打开的窗口,我也会得到一个 30-40 个窗口的列表。

这是我的做法:

 CGWindowListOption opt = 1 << 4;
 CFArrayRef windowids =CGWindowListCreate(opt,kCGNullWindowID);

我想知道我做错了什么导致了这个问题,以及我能做些什么来解决它。我只是想让程序列出由应用程序创建的窗口,例如查找器窗口或浏览器窗口,而不是它包含的任何其他内容。预先感谢您的帮助。

4

2 回答 2

1

我发现一个解决方案是将窗口列表过滤到仅位于 Dock“下方”的那些窗口(就窗口分层而言)。

下面的代码对我来说效果很好。它获取屏幕上的所有窗口(不包括桌面元素)。它从列表中提取“Dock”窗口的窗口 ID。然后再次获取屏幕窗口,仅过滤到 Dock 窗口“下方”的那些窗口。

// Fetch all on screen windows
CFArrayRef windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements, kCGNullWindowID);
NSArray *windows = CFBridgingRelease(CGWindowListCreateDescriptionFromArray(windowListArray));

NSLog(@"All on screen windows: %@", windows);

// Find window ID of "Dock" window
NSNumber *dockWindowNumber = nil;
for (NSDictionary *window in windows) {
    if ([(NSString *)window[(__bridge NSString *)kCGWindowName] isEqualToString:@"Dock"]) {
        dockWindowNumber = window[(__bridge NSString *)kCGWindowNumber];
        break;
    }
}

NSLog(@"dockWindowNumber: %@", dockWindowNumber);

CFRelease(windowListArray);

if (dockWindowNumber) {
    // Fetch on screen windows again, filtering to those "below" the Dock window
    // This filters out all but the "standard" application windows
    windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenBelowWindow|kCGWindowListExcludeDesktopElements, [dockWindowNumber unsignedIntValue]);
    NSArray *windows = CFBridgingRelease(CGWindowListCreateDescriptionFromArray(windowListArray));
    NSLog(@"On screen application windows: %@", windows);
}
else {
    NSLog(@"Could not find Dock window description");
}
于 2013-04-13T08:27:43.917 回答
1

这将返回每个窗口,无论它是在屏幕上还是在屏幕外,你应该将它与选项结合起来kCGWindowListOptionOnScreenOnly(并且不要对你正在使用的那个进行硬编码)。它看起来像这样:

CGWindowListOption opt = kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements;
CFArrayRef windowids =CGWindowListCreate(opt,kCGNullWindowID);

无论如何,这就是我从文档中收集到的。

于 2012-06-22T06:18:44.290 回答