Macos OSX:如何从CGWindowListCopyWindowInfo中过滤出菜单栏

Macos OSX:如何从CGWindowListCopyWindowInfo中过滤出菜单栏,macos,core-graphics,Macos,Core Graphics,我正在使用CGWindowListCopyWindowInfo获取桌面上的窗口列表。我想使用的值只过滤出可见的窗口。我遇到问题的一个窗口是OSX菜单栏。我想到的一个解决方案是查看窗口边界的X和Y。没有一个可见窗口的这两个值都等于0,但我不确定这个方法有多可靠 另一种方法是将PID值与OSX窗口服务器的PID值进行比较,但我不确定如何得到它。有谁能告诉我正确的API,或者知道过滤菜单栏的可靠方法吗 编辑:我的代码与下面的kondy相同,但添加了以下内容,因为listOptions本身不够好: C

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

另一种方法是将PID值与OSX窗口服务器的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
}

我找到了一个过滤掉“窗口服务器”的答案:

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


我希望它能帮助你

你找到解决方案了吗?我最后检查了窗口边界,看看x和y是否都等于0。这篇文章告诉你如何获得窗口边界:我有一些添加相同的代码(编辑了原始答案)。
CGWindowListOption listOptions = kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements;
CFArrayRef windowList = CGWindowListCopyWindowInfo(listOptions, kCGNullWindowID);