Mac OS X Lion:检测另一个应用程序是否以全屏模式运行?

时间:2011-08-21 12:17:03

标签: cocoa fullscreen nswindow osx-lion

在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];
}

4 个答案:

答案 0 :(得分:1)

嗯,你有没有排除使用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”。

你需要研究这个。

答案 1 :(得分:1)

使用通知。例如:

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

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

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

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

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

object参数用于指定要从中接收通知的对象。由于您想知道任何应用程序何时全屏显示,因此您需要保留此零值。

请记住在取消分配对象之前将其移除为观察者!

答案 2 :(得分:1)

上述注册方法

“NSWindowWillEnterFullScreenNotification”

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

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

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

答案 3 :(得分:0)

经过很大的挫败之后,这对我来说非常有用,因为它获得了一个漂浮在除了全屏空间之外的所有空间上的窗口。我看到了fullScreenNone常量名称,由于它描述了我想要的内容,因此我尝试了一下,发现它可以正常工作。

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