所有空间都可见的窗口(包括其他全屏应用)

时间:2015-11-21 16:11:01

标签: swift macos cocoa nswindow

我正在尝试在所有空间(包括其他全屏应用程序窗口)上显示一个窗口(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)

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

2 个答案:

答案 0 :(得分:5)

如果您希望在其他全屏窗口(空格)上显示窗口,则应创建代理(附件)应用程序。 您可以通过在应用程序的LSUIElement中将Info.plist键设置为1 (YES)

来实现此目的

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

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

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

    • NSApp.setActivationPolicy(.accessory)切换到座席(附件)
    • NSApp.setActivationPolicy(.regular)切换到普通应用程序
  3. 请注意,.accessory政策隐藏了Dock中的图标,您仍然需要已有的代码:

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

答案 1 :(得分:3)

您在某种程度上处于正确的轨道上,您需要将窗口对象的级别设置为屏蔽窗口之上的一个级别,以便位于最前沿:

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

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