2

我正在使用 CGWindowListCopyWindowInfo 来获取桌面上的窗口列表。我想只使用Window List keys的值过滤掉可见的窗口。我遇到问题的一个窗口是 OSX 菜单栏。我想到的一种解决方案是查看窗口边界的 X 和 Y。没有可见的窗口似乎两者都等于 0,但我不确定这种方法有多可靠。

另一种方法是将PID号与OSX Window Server的PID号进行比较,但我不知道如何得到它。谁能指出我正确的 API 或知道过滤菜单栏的可靠方法?

编辑:我有与下面的 kondy 相同的代码,并添加了以下内容,因为 listOptions 本身还不够好:


CGRect windowBounds;
CGRectMakeWithDictionaryRepresentation((CFDictionaryRef) [windowInfo objectForKey:(id)kCGWindowBounds], &windowBounds);

if (!(windowBounds.origin.x == 0 && windowBounds.origin.y == 0))
{
    // Work with windows that aren't the Menubar
}
4

1 回答 1

2

我找到了过滤掉“Window Server”的答案:

CGWindowListOption listOptions = kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements;
CFArrayRef windowList = CGWindowListCopyWindowInfo(listOptions, kCGNullWindowID);

使用这些 ORed 选项,我在“活动管理器”中得到与 mac 的“窗口进程”相同的结果

我希望它会帮助你!

于 2013-06-21T15:16:53.633 回答