在Mac上检测全屏

时间:2009-03-11 02:11:41

标签: python objective-c cocoa macos fullscreen

我正在为Mac编写一个IM客户端(在Python中,但这里的Objective C / Cocoa解决方案很好)。我想检测用户当前是在观看电影还是在前台玩游戏,或者做其他任何占用整个屏幕的事情。如果是这样,当新的IM进入时我不会播放声音,但如果没有,我将播放声音。

我怎样才能发现这个?有没有办法用Applescript获取前景窗口并查看其尺寸?或者是否有其他API调用?

4 个答案:

答案 0 :(得分:9)

要检查全屏,请在每个屏幕上调用CGDisplayIsCaptured(screenID)

但我不确定你是否正在检查正确的事情。首先,我可以捕获一个屏幕(“全屏”)和第二个屏幕未捕获,在这种情况下你想做什么?

此外,全屏真的有意义吗?如果我正在使用GarageBand来处理一首歌,我可能不想听到随机的声音,无论是否有任何全屏。或者我可以运行Windows VM全屏,但仍希望收到有关IM的通知。

答案 1 :(得分:2)

不完全确定如何执行此操作,但apple docs说:

  

跟踪登录中的更改   会话的演示模式,你可以   处理   kEventAppSystemUIModeChanged碳   事件

答案 2 :(得分:0)

到目前为止发布的两个解决方案适用于“真正的”全屏,但值得注意的是,许多全屏应用只是在整个屏幕上放置一个窗口(或者,正如vasi指出的那样, a 整个屏幕)。准确的说,你必须检查两者。

答案 3 :(得分:0)

在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'......