OSX窗口捕获

时间:2013-12-22 18:57:56

标签: c++ objective-c macos

我一直在花时间看OSX中的窗口系统。我正在尝试了解我正在处理的一些捕获代码的所有信息。

我想做什么

我希望能够过滤我的窗口查询,以便我抓取在任何空格中可见的窗口,或在任何空格中最小化。

远远地工作

现在,使用SonOfGrab测试代码和文档,我创建了一个程序,可以查询窗口服务器并给我一个这样的列表:

{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}

我过滤掉所有桌面元素,我只抓住可共享的窗口。

我学到了什么

据我所知,从文档来看,这是有限的,我的示例程序是这些东西

  1. 窗口的visibility属性将告诉您它是否可见 在当前活跃的空间。
  2. 这一层似乎很重要。据我所知,我想要过滤的窗口仅在第0层可用。看起来其他图层与停靠栏,工具栏,图标等相关。
  3. 在第0层中不可见的项目有时最小化窗口。
  4. 我遇到的问题

    以下是我的代码和SonOfGrab示例所面临的问题。

    1. 在某些应用程序上最小化的窗口和关闭的窗口似乎是相同的。例如,使用活动监视器。如果我最小化窗口或关闭它,输出是相同的。还有其他领域可以帮助我区分这个吗?这似乎是因为应用程序始终在任务栏中运行。
    2. 最小化的活动监视器

      {
          "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将是可见的,其余的是不可见的。
      3. 概要

        我希望能够只列出可在任何空间中查看或最小化并且可能被查看的窗口。它似乎是可见性和层次的帮助,但也许我需要更多的窗口细节来解决这个问题。任何想法: - )?

1 个答案:

答案 0 :(得分:0)

我认为你无法达到你想要的效果。

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

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

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

换句话说,即使在窗口服务器的内部,最小化窗口和隐藏窗口之间的差别也很小。

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