OSX窗口捕获

5
我花了一些时间研究OSX的窗口系统。我正在尝试理解所有相关信息,以便为我正在开发的捕获代码做准备。
我想筛选我的窗口查询,以便仅获取在任何空间中可见或在任何空间中最小化的窗口。
目前为止,使用SonOfGrab测试代码和文档,我已经创建了一个程序,可以查询窗口服务器并给出像这样的列表:
{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}

我筛选掉所有桌面元素,只抓取可共享的窗口。

我学到了什么

据文档和我的示例程序所示:

  1. 窗口的可见性属性可以告诉你它是否在当前活动空间中可见。
  2. 窗口的层似乎很重要。据我所知,我想要筛选的窗口仅在第0层可用。其他层与Dock、工具栏、图标等相关。
  3. 不可见但在第0层的项目有时是最小化的窗口。

我遇到的问题

以下是我在代码和SonOfGrab示例中遇到的问题。

  1. 某些应用程序上的最小化窗口和关闭窗口似乎是相同的。例如,在Activity Monitor中。如果我将窗口最小化或关闭,输出结果相同。是否有其他字段可以帮助我区分这一点?这似乎是因为应用程序始终在任务栏中运行。

最小化的Activity Monitor

{
    "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
},
  1. 即使我过滤掉桌面元素,并且只从第0层抓取,我仍然看到SystemUIServer在运行。当我尝试使用SonOfGrab抓取它的窗口时,我什么都没有得到。有没有更有意义的过滤方法,除了通过名称?
  2. 无法查看的窗口。使用XCODE时,我注意到如果我打开并可见一个项目,我的程序和SonOfGrab将在第0层显示5个窗口。其中1个是可见的,其余的是不可见的。

摘要

我希望能够只列出任何空间中可见或最小化并可能被查看的窗口。看起来可见性和层次有点帮助,但也许我需要更多的窗口细节来弄清楚这个问题。有什么想法:-)?

1个回答

0

我认为你无法实现你想要的。

你可能会对不在第0层的窗口感兴趣。该层对应于文档中其他地方称为“窗口级别”的内容。请参见-[NSWindow setLevel:]CGWindowLevelForKey()。例如,在我的测试中,浮动面板位于第3层。

由于您正在使用CGWindowList API,因此可以使用kCGWindowListExcludeDesktopElements来排除菜单栏、Dock等。您似乎已经意识到了这一点,所以我不确定为什么您要查看层属性。

其次,我怀疑你无法区分最小化和“隐藏”的窗口。列表中存在一个窗口仅意味着它有一个关联的“窗口设备”。(请参见-[NSWindow initWithContentRect:...]方法的deferCreation参数和-[NSWindow windowNumber]方法的描述。)但是如果窗口在另一个空间中、被最小化或由其应用程序从窗口列表中订购(即已隐藏),则窗口不会可见。实际上,如果窗口是一次性窗口(请参阅-setOneShot:),当它被最小化或隐藏时,窗口设备可能被释放。

换句话说,在窗口服务器内部,最小化的窗口和已隐藏的窗口之间几乎没有什么区别。

最后,您无法捕获未在当前空间或已最小化的窗口的内容。您可以使用Son of Grab示例代码查看此内容。


感谢指出级别API。关于窗口级别本身是否有更详细的信息?我是OSX GUI编程的新手,不确定所有术语的含义,例如TornOffMenu。我知道无法捕获屏幕外的窗口,但我只是想知道可能可用的内容。我希望能够将此列表过滤到我想要的内容 :-)。 - anoneironaut
撕掉菜单是NeXTStep的一个功能,但它没有在OS X中保留下来。您可以将菜单拖出分层菜单结构,这将使其变成一个持久的浮动窗口,因此您可以像点击按钮一样单击它。在Cocoa中,如果有帮助理解,NSTornOffMenuWindowLevelNSSubmenuWindowLevel的同义词。菜单栏位于一个级别,从其下拉的菜单位于另一个级别。 - Ken Thomases
谢谢Ken。看起来我不能做我想做的事情。但至少我知道要更深入地了解层次结构。谢谢。 - anoneironaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接