我花了一些时间研究OSX的窗口系统。我正在尝试理解所有相关信息,以便为我正在开发的捕获代码做准备。
我想筛选我的窗口查询,以便仅获取在任何空间中可见或在任何空间中最小化的窗口。
目前为止,使用SonOfGrab测试代码和文档,我已经创建了一个程序,可以查询窗口服务器并给出像这样的列表:
我筛选掉所有桌面元素,只抓取可共享的窗口。
我想筛选我的窗口查询,以便仅获取在任何空间中可见或在任何空间中最小化的窗口。
目前为止,使用SonOfGrab测试代码和文档,我已经创建了一个程序,可以查询窗口服务器并给出像这样的列表:
{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}
我筛选掉所有桌面元素,只抓取可共享的窗口。
我学到了什么
据文档和我的示例程序所示:
- 窗口的可见性属性可以告诉你它是否在当前活动空间中可见。
- 窗口的层似乎很重要。据我所知,我想要筛选的窗口仅在第0层可用。其他层与Dock、工具栏、图标等相关。
- 不可见但在第0层的项目有时是最小化的窗口。
我遇到的问题
以下是我在代码和SonOfGrab示例中遇到的问题。
- 某些应用程序上的最小化窗口和关闭窗口似乎是相同的。例如,在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
},
- 即使我过滤掉桌面元素,并且只从第0层抓取,我仍然看到SystemUIServer在运行。当我尝试使用SonOfGrab抓取它的窗口时,我什么都没有得到。有没有更有意义的过滤方法,除了通过名称?
- 无法查看的窗口。使用XCODE时,我注意到如果我打开并可见一个项目,我的程序和SonOfGrab将在第0层显示5个窗口。其中1个是可见的,其余的是不可见的。
摘要
我希望能够只列出任何空间中可见或最小化并可能被查看的窗口。看起来可见性和层次有点帮助,但也许我需要更多的窗口细节来弄清楚这个问题。有什么想法:-)?
NSTornOffMenuWindowLevel
是NSSubmenuWindowLevel
的同义词。菜单栏位于一个级别,从其下拉的菜单位于另一个级别。 - Ken Thomases