You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使代码创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:07:06