【问题标题】:Window visible on all spaces (including other fullscreen apps)所有空间上可见的窗口(包括其他全屏应用程序)
【发布时间】:2016-02-24 01:22:27
【问题描述】:

我正在尝试在所有空间(包括其他全屏应用程序窗口)上显示一个窗口 (NSWindow)。我一直在尝试设置更高的窗口级别以及在检查器中使用暴露和空间设置。我在这里找到了一些解决方案,但它们不起作用。至少在 El Capitan 上。

这里是一个示例代码来测试:

let window = NSWindow(contentRect: NSRect(x: 300, y: 300, width: 200, height: 200), styleMask: NSBorderlessWindowMask, backing: .Buffered, `defer`: true)
window.backgroundColor = NSColor.greenColor()
window.level = Int(CGWindowLevelForKey(.FloatingWindowLevelKey))
window.collectionBehavior = [.CanJoinAllSpaces, .Transient]
window.makeKeyAndOrderFront(nil)

现在它会在所有桌面空间上显示窗口,但不会在其他应用程序的全屏窗口上显示。

【问题讨论】:

  • 你解决了这个问题吗?我现在正面临这个问题,我会很感激一些帮助。谢谢

标签: swift macos cocoa nswindow


【解决方案1】:

如果您希望一个窗口在其他全屏窗口(在空格中)之上可见,您应该制作一个代理(附件)应用程序。 您可以通过将应用程序的Info.plist 中的LSUIElement 键设置为1 (YES) 来做到这一点

如果您仍然需要常规应用程序,您可以执行以下操作:

  1. 在您的主应用程序包中创建一个单独的代理(帮助程序)应用程序,该应用程序将显示您的窗口。 (关于如何创建这样的应用程序有很多很好的例子)

  2. NSApplicationActivationPolicy 一起玩。您可以尝试在运行时更改应用程序的激活策略。 斯威夫特 3:

    • NSApp.setActivationPolicy(.accessory)切换代理(附件)
    • NSApp.setActivationPolicy(.regular)切换到普通应用

请记住,.accessory 策略会从 Dock 中隐藏图标,您仍然需要已有的代码:

window.collectionBehavior = .canJoinAllSpaces window.level = Int(CGWindowLevelForKey(.floatingWindow))

【讨论】:

    【解决方案2】:

    您在某种程度上是正确的,您需要将窗口对象的级别设置为高于 Shield Window 的级别才能位于最前面:

            window.level = Int(CGShieldingWindowLevel()) + 1
    

    请注意,这种技术并不是真正推荐的,因为全屏图形(OpenGL 全屏绘图上下文就是一个例子)和图形硬件之间的交互可能会出现一些问题;但如果您想确保覆盖在所有其他应用程序之上,这是您最好的选择。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 2015-05-12
      • 2014-07-19
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多