允许NSWindow(NSPanel)浮在全屏应用程序之上

11

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

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

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

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

我还可以使用NSNonactivatingPanelMask选项将其设置为NSPanel。

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

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


1
你是怎么知道只有在LSUIElement=true时才能正常工作的? 这个有文档记录吗? 我试了一整天不同的配置,最终得出相同的结论,只有在LSUIElement=true时才能正常工作。有没有办法让LSUIElement=false时也能实现相同的行为? - alfonsodev
3个回答

18

好的,我的想法是正确的,麻烦的部分在于所有选项之间的交互方式。以下是有效的:

  • NSPanel而不是NSWindow
  • 样式掩码:[.borderless, .nonactivatingPanel]

还有这些属性:

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

Swift 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()

浮动的NSPanel位于全屏macOS应用程序上方

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

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()

如何在桌面上绘制NSpaned?如何显示它?如何使用它来替换NSWindow? - Andrew_STOP_RU_WAR_IN_UA

2

而 Swift 4.0 的翻译是这样的... 我仍在测试中,但它似乎正在工作。

self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

对我来说不起作用 - macOS 12.5.1 (21G83)。 - Andrew_STOP_RU_WAR_IN_UA

0

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

window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

对我不起作用 - macOS 12.5.1(21G83) - Andrew_STOP_RU_WAR_IN_UA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接