我使用CGWindowListCopyWindowInfo来抓取桌面上的窗口列表。我想只过滤掉使用窗口列表键值的可见窗口。我遇到麻烦的一个窗口是OSX菜单栏。我想到的一个解决方案是查看窗口边界的X和Y。没有可见的窗口似乎这两个值都等于0,但我不确定这种方法有多可靠。
另一种方法是将PID号与OSX窗口服务器的PID号进行比较,但我不确定如何得到它。有人能指出我对正确的API或知道一个可靠的方式来过滤掉菜单栏吗?
编辑:由于listOptions本身不够好,我有与下面kondy相同的代码,并添加了以下内容:
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
}
我找到了一个答案来过滤掉"Window Server":
CGWindowListOption listOptions = kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements;
CFArrayRef windowList = CGWindowListCopyWindowInfo(listOptions, kCGNullWindowID);
使用这些or选项,我得到的结果与mac的"window processes"在"Activity Manager"
我希望它会帮助你!