OSX窗口捕获

OSX Window Capture

本文关键字:窗口 OSX      更新时间:2023-10-16

我花了一些时间研究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. 一些应用程序上的最小化窗口和关闭窗口似乎是相同的。例如,使用活动监视器。如果我最小化窗口或关闭它,输出是相同的。还有其他领域可以帮助我区分这一点吗?出现这种情况似乎是因为应用程序总是在任务栏中运行

最小化活动监视器

{
"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将可见,其余将不可见

摘要

我希望只能列出在任何空间中都可以查看的窗口,或者最小化并可能被查看的窗口。这看起来像是可见性和层次的帮助,但也许我需要更多的窗口细节来解决这个问题。有什么想法吗?

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

您可能对不在图层0中的窗口感兴趣。该层对应于文档中其他地方所谓的"窗口级别"。参见-[NSWindow setLevel:]CGWindowLevelForKey()。例如,在我的测试中,一个浮动面板位于第3层。

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

其次,我怀疑你是否能区分最小化窗口和"隐藏"窗口。窗口在列表中的存在仅意味着它具有关联的"窗口设备"。(请参阅-[NSWindow initWithContentRect:...]方法的deferCreation参数和-[NSWindow windowNumber]方法的说明。)但是,如果窗口在另一个空间上、最小化或应用程序已将其从窗口列表中排序(即隐藏),则该窗口将不可见。事实上,如果窗口是一次性窗口(请参阅-setOneShot:),则窗口设备可能会在最小化或隐藏时被解除分配。

换句话说,最小化的窗口和隐藏的窗口之间几乎没有区别,即使在窗口服务器的内部也是如此。

最后,您无法捕获不在当前空间中或最小化的窗口的内容。您可以在Grab之子示例代码中看到这一点。