【问题标题】:How to force an NSWindow to be in front of every app? Even fullscreen apps如何强制 NSWindow 出现在每个应用程序的前面?甚至全屏应用程序
【发布时间】:2012-06-09 22:15:37
【问题描述】:

我有一个NSWindow,我想把它放在所有东西的前面(计算机的每个应用程序、全屏应用程序等)。即使我点击后台应用程序,NSWindow 也无法进入后台。并且NSWindow 必须跟随用户屏幕,例如,如果用户将桌面切换到桌面2,等等...... 我该怎么做?
谢谢!

【问题讨论】:

    标签: objective-c xcode macos cocoa nswindow


    【解决方案1】:

    如果您不需要在其他应用的全屏窗口中可见,这并不太难。

    首先,要领先于其他一切,只需 setLevel: 使用 NSFloatingWindowLevel 或更高。尝试不同的值,看看哪个值适合您的需求。

    接下来,即使用户更改了 Spaces,也可以保持在前面,可能包括 Exposé/Mission Control,setCollectionBehavior: 使用适当的标志对,或者在创建笔尖上的窗口。可以加入所有空间或移动到活动空间将确保您在每个空间中保持可见,但方式略有不同。您可能希望将 Exposé 设置为固定,或者也可能是瞬态。再次尝试两种方式,看看。

    但是,当用户切换到全屏空间或仪表板或启动板时,Lion 将隐藏所有空间和移动到活动空间窗口。如果你看的话,你会发现它对这三种情况的每一种都以不同的方式做到这一点。雪豹做事有点不同,山狮也是。

    如果您想解决最后一个问题,您需要一些技巧——并且针对每种情况和每个操作系统版本使用不同形式的技巧。基本技巧是捕捉与隐藏相关的通知并在适当的时候取消隐藏。

    【讨论】:

    • 非常感谢!我将级别设置为 NSFloatingWindowLevel、Spaces: Can Join All Spaces 和 Exposé: Transient Behavior,它的工作方式正是我想要的! NSWindow 到处跟着我。谢谢!
    • 最后一个想法:使用 NSPanel 代替 NSWindow 可能更合适(并且可能使用 setFloatingPanel:YES 代替 setLevel:NSFloatingWindowLevel)。
    【解决方案2】:

    您应该修改您的 info.plist 并将 Application is Agent 标志设置为 YES。代理的窗口可以显示在全屏窗口的前面。

    【讨论】:

    • 代理窗口有其他副作用,所以不理想。此外,这似乎意味着该应用程序一直停留在它诞生时的全屏状态。
    【解决方案3】:

    同时设置, info.plist 中的“Application is agent (UIElement)”为“YES”

    & 窗位:

    self.view.window?.level = NSWindow.Level(rawValue: kCGMainMenuWindowLevel.hashValue - 1)
    self.view.window?.collectionBehavior = [.stationary, .canJoinAllSpaces, .fullScreenAuxiliary]
    

    帮助了我。

    【讨论】:

    • hashValue 并没有真正的意义。我想你的意思是写在第一行 self.view.window?.level = NSWindow.Level(rawValue: Int(kCGMainMenuWindowLevel) - 1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2016-07-12
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多