我正在为 Mac 编写一个 IM 客户端(在 Python 中,但这里的 Objective C / Cocoa 解决方案很好)。我想检测用户当前是否正在看电影或在前台玩游戏,或者做任何其他占用整个屏幕的事情。如果是这样,当新的 IM 进来时我不会播放声音,但如果不是,我会播放声音。
我怎样才能检测到这个?有没有办法用 Applescript 获取前景窗口并查看它的尺寸?还是有其他 API 调用?
我正在为 Mac 编写一个 IM 客户端(在 Python 中,但这里的 Objective C / Cocoa 解决方案很好)。我想检测用户当前是否正在看电影或在前台玩游戏,或者做任何其他占用整个屏幕的事情。如果是这样,当新的 IM 进来时我不会播放声音,但如果不是,我会播放声音。
我怎样才能检测到这个?有没有办法用 Applescript 获取前景窗口并查看它的尺寸?还是有其他 API 调用?
要检查全屏,请在每个屏幕上调用CGDisplayIsCaptured(screenID) 。
但我不确定你是否在检查正确的事情。一方面,我可以捕获一个屏幕(“全屏”)和未捕获的第二个屏幕,在这种情况下你想做什么?
另外,全屏真的意味着什么吗?如果我使用 GarageBand 创作歌曲,我可能不想听到随机声音,无论是否全屏。或者我可能正在全屏运行 Windows VM,但仍希望收到有关 IM 的通知。
不完全确定如何做到这一点,但苹果文档说:
要跟踪登录会话的演示模式的变化,您可以处理
kEventAppSystemUIModeChanged
Carbon 事件
到目前为止发布的两种解决方案都适用于“真正的”全屏,但值得注意的是,许多全屏应用只是在整个屏幕上放置了一个窗口(或者,正如 vasi 指出的那样,整个屏幕)。为了准确起见,您必须同时检查两者。
在 Mountain Lion(可能更早)中,您可以通过监视分布式通知 com.apple.HIToolbox.hideMenuBarShown 和 com.apple.HIToolbox.hideMenuBarShown 来跟踪菜单栏的存在。通常没有菜单栏==全屏模式。这适用于应用程序,因此您可以知道 VLC 何时进入全屏模式,或者何时有人以全屏模式切换到 iCal。
为此,请注册以下两个通知:
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
selector:@selector(windowDidEnterFullScreen:)
name:@"com.apple.HIToolbox.hideMenuBarShown"
object:nil];
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
selector:@selector(windowDidExitFullScreen:)
name:@"com.apple.HIToolbox.frontMenuBarShown"
object:nil];
然后创建自己的选择器来处理这些情况。frontMenuBarShown 一直触发,所以要从全屏中捕捉到真正的返回,请注意“didEnter”之后的第一个“didExit”...