Window 在所有空间可见(包括其他全屏应用)

Window visible on all spaces (including other fullscreen apps)

我正在尝试使 window (NSWindow) 在所有空间都可见,包括其他全屏应用程序 windows。我一直在尝试设置更高的 window 级别以及在检查器中使用 expose 和 spaces 设置。我在这里找到了一些解决方案,但它们不起作用。至少在 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)

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

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

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

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

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

来实现

如果您仍然需要常规申请,您可以执行以下操作:

  1. 在您的主应用程序包中创建一个单独的代理(助手)应用程序,它将显示您的 window。 (有很多关于如何创建此类应用程序的好例子)

  2. NSApplicationActivationPolicy。您可以尝试在运行时更改应用程序的激活策略。 Swift 3:

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

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

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