OSX窗口捕获
OSX Window Capture
我花了一些时间研究OSX中的窗口系统。我正在努力了解它周围的所有信息,以获取我正在开发的一些捕获代码
我想做什么
我希望能够过滤我的窗口查询,以便我只抓取在任何空间中可见或在任何空间内最小化的窗口。
到目前为止的工作
现在,使用SonOfGrab测试代码和文档,我创建了一个程序,可以查询窗口服务器,并向我提供如下列表:
{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}
我过滤掉所有桌面元素,只抓取可共享的窗口。
我学到了什么
据我从文档中所知,这是有点有限的,我的示例程序是
- 窗口的可见性属性将告诉您它是否可见在当前活动空间中
- 这一层似乎很重要。据我所知,我想过滤的窗口只在第0层可用。看起来其他层与dock、工具栏、图标等相关
- 不可见但在层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层抓取。我仍然看到SystemUIServer四处浮动。当我试图用SonOfGrab抓住它的窗户时,我什么也没得到。除了按名称过滤,还有什么有意义的方法可以过滤吗
- 不可见的窗口。使用XCODE,我注意到如果我有一个项目打开并可查看。我的程序和SonOfGrab将在第0层显示5个窗口。1将可见,其余将不可见
摘要
我希望只能列出在任何空间中都可以查看的窗口,或者最小化并可能被查看的窗口。这看起来像是可见性和层次的帮助,但也许我需要更多的窗口细节来解决这个问题。有什么想法吗?
我认为你无法实现你想要的。
您可能对不在图层0中的窗口感兴趣。该层对应于文档中其他地方所谓的"窗口级别"。参见-[NSWindow setLevel:]
和CGWindowLevelForKey()
。例如,在我的测试中,一个浮动面板位于第3层。
由于您使用的是CGWindowList
API,因此可以使用kCGWindowListExcludeDesktopElements
来排除菜单栏、Dock等。您似乎已经意识到了这一点,所以我不确定您为什么要查看层属性。
其次,我怀疑你是否能区分最小化窗口和"隐藏"窗口。窗口在列表中的存在仅意味着它具有关联的"窗口设备"。(请参阅-[NSWindow initWithContentRect:...]
方法的deferCreation
参数和-[NSWindow windowNumber]
方法的说明。)但是,如果窗口在另一个空间上、最小化或应用程序已将其从窗口列表中排序(即隐藏),则该窗口将不可见。事实上,如果窗口是一次性窗口(请参阅-setOneShot:
),则窗口设备可能会在最小化或隐藏时被解除分配。
换句话说,最小化的窗口和隐藏的窗口之间几乎没有区别,即使在窗口服务器的内部也是如此。
最后,您无法捕获不在当前空间中或最小化的窗口的内容。您可以在Grab之子示例代码中看到这一点。
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- 如何在Mac OSX上的窗口客户端内获取真实的鼠标位置?
- OSX窗口捕获
- 如何在OSX中执行时强制Qt应用程序成为活动/前台窗口
- 如何在 OSX 上创建一个用于C++的窗口
- 如何在OSX中使用C++opencv highgui将活动窗口设置为opencv图像
- OSX: GLUT窗口永远不会出现
- Gtkmm 无法在 OSX 上打开应用程序窗口
- 如何在mac osx中隐藏终端窗口
- 在OSX上浮动没有标题栏的GLUT窗口
- 过剩窗口菜单栏在MAC OSX
- GLFW 无法在 OSX 中打开窗口