【问题标题】:Mac OS X Lion: Detect if another application is running in full screen mode?Mac OS X Lion:检测其他应用程序是否以全屏模式运行?
【发布时间】:2011-10-31 13:53:17
【问题描述】:

在 Cocoa 应用程序中,有没有办法判断另一个应用程序当前是否处于全屏模式?

我的应用程序被配置为显示在所有空间上并侦听mouseEntered 事件以将自己排在前面。

问题是当另一个应用程序处于全屏模式并且用户碰巧将鼠标移动到我的应用程序窗口所在的黑色区域时,它会被带到前面(发生在多个监视器上)。

我只看到启用[self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]; 的上述行为。

这里是我的应用程序的其他相关代码。

- (void) mouseEntered:(NSEvent *)theEvent
{
    // Don't do this when another app is in full screen mode:
    [[self window] orderFront:self];
}

【问题讨论】:

标签: cocoa fullscreen nswindow osx-lion


【解决方案1】:

上面提到的注册方法

“NSWindowWillEnterFullScreenNotification”

不起作用,它们可以用来通知你自己的应用程序,使用它们我们无法检测任何其他应用程序是否处于全屏模式。

然而,在尝试了这么多选项后,在 github 上发现了 FullScreen 检测器应用这个有用的链接 ..:):)

https://github.com/shinypb/FullScreenDetector.git

【讨论】:

  • 对此+1,简而言之,你需要听NSWorkspace.activeSpaceDidChangeNotification(Swift 5)
【解决方案2】:

嗯,您排除了使用 applescript/scriptingbridge 的可能性吗?您可以从 applescript 获取窗口大小并将它们与屏幕大小进行比较。 (或者您不知道给定应用程序在哪个屏幕上?)
某些可访问的应用程序将在其窗口上具有“AXFullScreen”属性。例如,这适用于 一些 应用程序:

  tell application "System Events"
    tell process "Pages"
        repeat with myWin in windows
            get value of attribute "AXFullScreen" of myWin
        end repeat
    end tell 
end tell

真正的行动似乎是在碳... MacWindows.h 和 CarbonEvents.h 在其中提到了“FullScreen”。

不过,您需要对此进行研究。

【讨论】:

【解决方案3】:

使用通知。例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(willEnterFull:)
                                             name:NSWindowWillEnterFullScreenNotification
                                           object:nil];

实际上,您可能希望改用 NSDistributedNotificationCenter,因为它跨越进程。

您正在将您的对象添加为观察者,这样当其他人发布将进入全屏的通知时,您的对象将收到该通知。

选择器是您希望通知进程调用的消息/方法。

name 参数是通知的实际名称。这些是标准的,除非您要为您将要使用的东西创建自定义通知。

object 参数用于指定要从哪个对象接收通知。由于您想知道任何应用程序何时全屏显示,因此您希望将其保留为 nil。

请记住在释放对象之前将其作为观察者移除!

【讨论】:

  • 这仅适用于在您的应用程序启动后变为全屏的应用程序。如果您的应用程序启动时有全屏应用程序正在运行,它们将不会向您的应用程序发送新通知。
  • 是的,之前的通知不会重新发送到刚刚启动的应用程序。所以,确实,如果 Mark 需要在他的应用程序启动时知道其他应用程序是否已经全屏打开,那么这将无济于事。但是一旦他的应用程序启动,它就会检测到任何从那时起进入全屏模式的应用程序。
  • Mountain Lion 中的通知行为是否发生了变化?因为您的代码不会给我任何通知(使用分布式中心)。当我将 name 参数设置为 nil(接收所有通知)时,进入全屏模式时我只会得到“com.apple.HIToolbox.hideMenuBarShown”。
【解决方案4】:

在经历了很多挫折之后,这对我来说很有效,我得到了一个浮动在除全屏之外的所有空间上的窗口。我看到了fullScreenNone这个常量名,因为它描述了我想要的,我试了一下,发现它有效。

    window.level = .floating
    window.collectionBehavior = [.canJoinAllSpaces, .fullScreenNone]
    window.canHide = false

【讨论】:

  • 九年后,感谢您花时间回答这么老的问题!当我遇到这个问题时,我开发的应用程序甚至已经不存在了。我会接受你的回答,最终解决这个问题。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
相关资源
最近更新 更多