8

我正在尝试添加一个小窗口,该窗口可从系统中的任何位置向主应用程序提供“快速输入”。

用户可以按下热键,窗口弹出,并浮动在所有其他窗口之上。

在大多数情况下,这不是什么大问题。我可以将 NSWindow 配置为:

level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces

我还可以将其设为带有NSNonactivatingPanelMask选项集的 NSPanel。

唯一的问题是:即使用户在包含全屏应用程序的空间中,如何才能使窗口在屏幕上弹出?

我知道当应用程序是LSUIElement=true(在 Dock 中没有位置的应用程序)时这是可能的,但我的不是。

4

3 回答 3

12

好的,我有正确的想法,棘手的部分是所有选项如何相互作用。这是有效的:

  • NSPanel,不是NSWindow
  • 风格面具:[.borderless, .nonactivatingPanel]

还有这些属性:

panel.level = .mainMenu
panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

斯威夫特 4.2 代码

使用这些设置创建并显示面板。然后您可以将面板拖到全屏应用程序上(双显示器设置)。

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.titled, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()

在全屏 macOS 应用程序上方浮动 NSPanel

切换到无边框将阻止用户移动您的窗口。

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.borderless, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()
于 2016-03-24T17:12:01.443 回答
2

Swift 4.0 的翻译是这样的。我还在测试这个,但它似乎正在工作。

self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
于 2018-03-02T18:04:57.177 回答
0

您的自我回答的 Swift 3.0 版本是

window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
于 2017-05-02T01:45:15.480 回答