【问题标题】:OSX Window CaptureOSX 窗口捕捉
【发布时间】:2013-12-22 18:57:56
【问题描述】:

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

我想做什么

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

工作至今

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

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

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

我学到了什么

据我所知,文档有点有限,我的示例程序就是这些东西

  1. 窗口的可见性属性会告诉你它是否可见 在当前活动空间中。
  2. 图层似乎很重要。据我所知,我要过滤的窗口仅在第 0 层可用。看起来其他层与停靠栏、工具栏、图标等有关。
  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 个可见,其余不可见。

总结

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

【问题讨论】:

    标签: c++ objective-c macos


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您指出关卡 API。是否有关于窗位本身的更详细信息?我是 OSX GUI 编程的新手,我不确定所有术语的含义,比如 TornOffMenu。我知道我无法捕捉屏幕外的窗口,但我只想知道什么是可能可用的。我只是希望我能把这个列表过滤成我想要的:-)。
    • 撕掉的菜单是 NeXTStep 的一个功能,但在 OS X 中没有。你可以把一个菜单从分层菜单结构中拖出来,这样它就变成了一个持久的浮动窗口,所以您可以单击它,就好像它充满了按钮一样。在 Cocoa 中,NSTornOffMenuWindowLevelNSSubmenuWindowLevel 的同义词,如果这有助于理解的话。菜单栏位于一层,从它下拉的菜单位于另一层。
    • 谢谢肯。看起来我将无法做我想做的事。但至少我知道要更多地研究这些层。谢谢。
    猜你喜欢
    • 2010-11-04
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2019-04-01
    • 1970-01-01
    • 2020-07-03
    • 2018-03-12
    相关资源
    最近更新 更多