我一直在花时间看OSX中的窗口系统。我正在尝试了解我正在处理的一些捕获代码的所有信息。
我希望能够过滤我的窗口查询,以便我仅抓取在任何空格中可见的窗口,或在任何空格中最小化。
现在,使用SonOfGrab测试代码和文档,我创建了一个程序,可以查询窗口服务器并给我一个这样的列表:
{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}
我过滤掉所有桌面元素,我只抓住可共享的窗口。
据我所知,从文档来看,这是有限的,我的示例程序是这些东西
以下是我的代码和SonOfGrab示例所面临的问题。
{
"name": "Activity Monitor",
"id": 94,
"width": 703,
"height": 728,
"visible": "NO",
"desktop": -1,
"owner pid": 2353,
"layer": 0
},
{
"name": "Activity Monitor",
"id": 94,
"width": 703,
"height": 728,
"visible": "NO",
"desktop": -1,
"owner pid": 2353,
"layer": 0
},
我希望能够只列出可在任何空间中查看或最小化并且可能被查看的窗口。它似乎是可见性和层次的帮助,但也许我需要更多的窗口细节来解决这个问题。任何想法: - )?
答案 0 :(得分:0)
我认为你无法达到你想要的效果。
您可能对不在第0层的窗口感兴趣。该层对应于文档中其他位置的“窗口级别”。请参阅-[NSWindow setLevel:]
和CGWindowLevelForKey()
。例如,在我的测试中,浮动面板位于第3层。
由于您使用的是CGWindowList
API,因此可以使用kCGWindowListExcludeDesktopElements
排除菜单栏,Dock等。您似乎已经意识到这一点,所以我不确定您为什么正在寻找图层属性。
其次,我怀疑你可以区分最小化和“隐藏”的窗口。列表中存在窗口仅意味着它具有关联的“窗口设备”。 (请参阅deferCreation
方法的-[NSWindow initWithContentRect:...]
参数和-[NSWindow windowNumber]
方法的说明。)但是如果窗口位于另一个空间,如果它被最小化,或者如果它被最小化,则该窗口将不可见它已被其应用程序(即隐藏)从窗口列表中排序。实际上,如果窗口是一次性窗口(参见-setOneShot:
),窗口设备可以在最小化或隐藏时解除分配。
换句话说,即使在窗口服务器的内部,最小化窗口和隐藏窗口之间的差别也很小。
最后,您无法捕获不在当前空间或最小化的窗口内容。你可以通过Son of Grab示例代码看到这一点。