Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 获取在Mac上运行应用程序的窗口列表_Objective C_Macos_Core Graphics_Quartz Graphics - Fatal编程技术网

Objective c 获取在Mac上运行应用程序的窗口列表

Objective c 获取在Mac上运行应用程序的窗口列表,objective-c,macos,core-graphics,quartz-graphics,Objective C,Macos,Core Graphics,Quartz Graphics,我使用samples from和samples获取窗口列表并抓取它们,特别是我使用CGWindowListCopyWindowInfo检索窗口列表以及指定的CGWindowListOption。但是我这里有个问题。问题是,我只想看到属于正在运行的应用程序的窗口列表,也就是说,我不想让windows用于dock、系统菜单等 我试图设置kCGWindowListExcludeDesktopElements和kcgwindowlistoptionnscreenononsoly标志,它们删除了一些我不感

我使用samples from和samples获取窗口列表并抓取它们,特别是我使用
CGWindowListCopyWindowInfo
检索窗口列表以及指定的
CGWindowListOption
。但是我这里有个问题。问题是,我只想看到属于正在运行的应用程序的窗口列表,也就是说,我不想让windows用于dock、系统菜单等

我试图设置
kCGWindowListExcludeDesktopElements
kcgwindowlistoptionnscreenononsoly
标志,它们删除了一些我不感兴趣的窗口,但是即使设置了这些选项,我仍然有“菜单栏中的Dropbox图标”窗口、停靠窗口、系统面板窗口等。有办法过滤掉它们吗

我还尝试请求
[[NSWorkspace sharedWorkspace]runningApps]
获取正在运行的应用程序列表。我的想法是从
runningApps
中获取进程标识符,并从
runningApps
列表中删除那些没有进程标识符的窗口。不幸的是,它没有成功,因为正在运行的应用程序列表比我预期的要大得多,而且它还包含仪表板应用程序和其他内容。我试图找到一个属性或类似的东西来区分这些“系统应用程序”和“真实应用程序”,但我没能做到这一点

有人知道如何解决这个问题吗

谢谢。

您可以:

  • 获取正在运行的应用程序的捆绑包
  • 检查它的plist是否有UIElement键->那些不在dock中
=>然后根据剩余的PID过滤窗口

您可以:

  • 获取正在运行的应用程序的捆绑包
  • 检查它的plist是否有UIElement键->那些不在dock中

=>然后根据剩余的PID过滤窗口

按窗口级别过滤?@Willeke,我有这个想法,我注意到所有我不感兴趣的窗口都有层号25、26等,而其他(我感兴趣的)都有层号0。你知道这个窗口层代表什么吗?过滤我感兴趣的窗口是否安全?我是否应该忽略所有级别大于0的窗口?如果没有文档记录,则不安全。按窗口级别过滤?@Willeke,我有这个想法,我注意到所有我不感兴趣的窗口都有层号25、26等,而其他窗口(我感兴趣的)都有层号0。你知道这个窗口层代表什么吗?过滤我感兴趣的窗口是否安全?我是否应该忽略级别大于0的所有窗口?如果没有文档记录,则不安全。是否要请求捆绑url,然后在捆绑中打开Info.plist\u url/Contents/Info.plist?嗯,我在两个应用程序上试过这个方法——这个方法很有效。谢谢这是一个安全的解决方案吗?这是解决此类问题的“官方”方式,还是更像是权宜之计?(我只是想确保该应用程序可以与不同的Mac OS X版本一起工作,并且不会产生任何意外的结果)它不是官方的,但听起来很安全。当然不是用沙箱(!)好的,明白了。Info.plist的位置是否标准化?它是否总是放在BUNDLE\u PATH/Info.plist中?是的。但你甚至使用了NSBundle。objectForInfoDictionaryKey,您的意思是使用从NSRunningApplication接收的路径初始化NSBundle,然后使用objectForInfoDictionaryKey获取该值的值,对吗?-好的建议,谢谢。您的意思是请求一个bundle url,然后在bundle\u url/Contents/Info.plist中打开Info.plist吗?嗯,我在两个应用程序上试过这个方法——这个方法很有效。谢谢这是一个安全的解决方案吗?这是解决此类问题的“官方”方式,还是更像是权宜之计?(我只是想确保该应用程序可以与不同的Mac OS X版本一起工作,并且不会产生任何意外的结果)它不是官方的,但听起来很安全。当然不是用沙箱(!)好的,明白了。Info.plist的位置是否标准化?它是否总是放在BUNDLE\u PATH/Info.plist中?是的。但你甚至使用了NSBundle。objectForInfoDictionaryKey,您的意思是使用从NSRunningApplication接收的路径初始化NSBundle,然后使用objectForInfoDictionaryKey获取该值的值,对吗?-好建议,谢谢。