如何使代码创建的NSWindow显示在其他全屏应用之上?
解决方案
要让NSWindow始终显示在其他应用之上同时支持全屏,你需要调整几个关键属性,以下是修改后的代码及关键说明:
修改后的代码
func openDummyWindow() { let controller = NSWindowController() let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 800, height: 600), styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], backing: .buffered, defer: false ) // 使用浮动窗口级别,无需特殊权限即可置顶 window.level = .floating // 设置为辅助激活策略,保持置顶且不抢夺焦点 window.activationPolicy = .accessory // 允许跨所有空间显示,并支持作为主全屏窗口 window.collectionBehavior = [.canJoinAllSpaces, .fullScreenPrimary] // 防止窗口关闭时被自动释放 window.isReleasedWhenClosed = false let contentView = ZStack { Color.clear Text("Hello") .font(.system(size: 72)) } window.contentView = NSHostingView(rootView: contentView) window.center() controller.window = window controller.showWindow(nil) // 强制将窗口前置激活 window.makeKeyAndOrderFront(nil) }
关键调整说明
window.level = .floating:这个级别是macOS专为浮窗设计的,优先级高于普通应用窗口,且不需要额外系统权限,比你尝试的.screenSaver更适合常规置顶场景。window.activationPolicy = .accessory:此策略让窗口保持置顶状态,同时不会抢夺当前活跃应用的焦点,避免干扰用户操作。如果用默认的.regular,窗口失去焦点后会被其他窗口覆盖。window.collectionBehavior = [.canJoinAllSpaces, .fullScreenPrimary]:.fullScreenPrimary允许窗口作为主窗口进入全屏模式,替代你原来的.fullScreenAuxiliary(后者是全屏辅助窗口,无法单独全屏)。window.isReleasedWhenClosed = false:默认NSWindowController会在窗口关闭时释放窗口实例,设置该属性可防止窗口被意外销毁。window.makeKeyAndOrderFront(nil):强制将窗口前置并激活,确保窗口立即显示在最上层,避免被其他窗口遮挡。
额外排查点
如果上述调整后仍无法置顶,可检查:
- 应用是否获得了必要的系统权限:前往「系统设置」→「隐私与安全性」,确保应用拥有「辅助功能」权限(部分高优先级窗口需要此权限)。
- 是否有其他应用使用了更高优先级的窗口级别:如果遇到这种情况,可尝试将
window.level改为.statusBar(比.floating级别更高)。
内容的提问来源于stack exchange,提问作者Source30
相关产品推荐
相关产品推荐

