objective-c - 如何检测/观察第三方应用何时启动全屏进程?

标签 objective-c macos cocoa

我想为游戏玩家构建一个帮助应用程序,并构建一些额外的功能,我想观察/计时某些第三方游戏的行为,更具体地说,当游戏实际启动全屏过程时。

例如:我的应用程序是一个系统托盘应用程序,游戏有一个带有大厅和菜单屏幕的“启动器”应用程序。一旦游戏启动了额外的进程,通常 OS X 会切换分辨率(可选)并且我的应用程序会以某种方式收到通知。然后我可以启动一个计时器。比赛结束后,进程关闭或游戏不再全屏,我的应用会收到第二条通知,我可以停止计时器。

是否有官方 Apple API 提供任何方式来观察/轮询应用全屏和/或启动我可以可靠地假设它是实际游戏屏幕的额外窗口?

最佳答案

我怀疑您会找到一个完全全面的解决方案。应用可以通过多种方式实现全屏体验,而且大多数都不会提供有关该事实的通知。

全屏应用可以修改NSApplicationpresentationOptions来隐藏Dock和菜单栏。另一个应用程序可以使用键值观察来监视其应用程序对象的 currentSystemPresentationOptions 属性,这将反射(reflect)当前系统状态。

全屏应用程序可以捕获显示(尽管 Apple 不鼓励这种技术)。您可以尝试通过调用 CGDisplayIsCaptured() 来检测这一点,尽管自 10.9 以来它已被弃用且没有替代品。如果您使用 CGDisplayRegisterReconfigurationCallback() 注册一个回调,您可能会在捕获显示时被调用。然而,捕获显示有点关于防止其他进程注意到此类更改,所以也许不会。在那种情况下,您必须进行投票。您也可以轮询当前的显示模式;改变模式是游戏首先捕获显示的主要原因。

全屏游戏也可以只创建一个屏幕大小的无边框窗口,并将其窗口级别设置在 Dock 和菜单栏(以及其他应用程序的窗口)的前面。确实没有关于此的通知。您可以使用 CGWindowList API 检测它,但您必须轮询。例如,您可以调用 CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID) 并遍历字典以查找与屏幕大小相同且窗口级别高于 kCGStatusWindowLevel 的字典。

(您可以使用 Accessibility API 在最前面的窗口发生变化时获得通知,因此您只需在发生这种情况时进行轮询。)

关于objective-c - 如何检测/观察第三方应用何时启动全屏进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29714017/

相关文章:

objective-c - 带有音频文件的 iPhone 应用程序太大了。如何减小尺寸?

iphone - NSMutableArray 似乎过早释放

iphone - 如何计算通过 cellForRowAtIndexPath 中的开关设置的单元格的 heightForRowAtIndexPath。

macos - XPC 服务不保存用户首选项

macos - 等待完成处理程序完成

cocoa - 绑定(bind)和 NSButton

macos - 控制台在 Apple 的快速入门中未显示 Mac OS 应用程序沙箱违规情况

iphone - 如何连接 nsstring url

ios - 退出全屏后 MPMoviePlayerController 缩放模式问题

iphone - NSThreaded 设计中的委托(delegate)? (iPhone)