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

如何在macOS应用开发中实现在第二显示屏打开全屏新窗口

macOS 多显示屏第二屏开全屏窗口实现方案(SwiftUI + AppKit 兼容方案)

以下为可直接落地的实现逻辑,SwiftUI 原生对多屏窗口的控制能力有限,搭配少量 AppKit 桥接代码即可满足需求:

  • 核心逻辑
    先获取所有外接屏幕实例,筛选出目标第二屏,再创建独立窗口绑定到对应屏幕,最后设置为全屏显示即可。

  • 完整代码示例

import SwiftUI
import AppKit

// 主界面视图
struct MainDisplayView: View {
    var body: some View {
        Button("打开第二屏全屏窗口") {
            openSecondScreenFullWindow()
        }
        .padding()
        .frame(width: 300, height: 200)
    }

    func openSecondScreenFullWindow() {
        // 校验是否存在第二显示屏
        guard NSScreen.screens.count > 1, let targetScreen = NSScreen.screens.first(where: { $0 != NSScreen.main }) else {
            print("未检测到外接第二显示屏")
            return
        }

        // 第二屏要渲染的自定义内容
        let secondScreenContent = SecondScreenView()
        // 创建匹配第二屏尺寸的无边框窗口
        let secondWindow = NSWindow(
            contentRect: targetScreen.frame,
            styleMask: [.borderless, .fullSizeContentView],
            backing: .buffered,
            defer: false,
            screen: targetScreen
        )
        // 配置窗口属性
        secondWindow.isOpaque = true
        secondWindow.backgroundColor = .black
        // 可根据需求调整窗口层级,值越高越不容易被其他应用遮挡
        secondWindow.level = .statusBar
        secondWindow.contentView = NSHostingView(rootView: secondScreenContent)
        secondWindow.makeKeyAndOrderFront(nil)
        // 触发全屏显示
        secondWindow.toggleFullScreen(nil)
    }
}

// 第二屏自定义展示视图,可根据业务需求自行修改
struct SecondScreenView: View {
    var body: some View {
        Text("第二屏全屏展示内容")
            .font(.system(size: 60, weight: .bold))
            .foregroundColor(.white)
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(.black)
    }
}
  • 额外配置说明
    • 如需避免全屏时系统自动切换到独立 Space 空间,可在项目 Info.plist 中添加键 NSFullScreenUsesSeparateSpace,值设置为 NO
    • 如果需要监听屏幕插拔的动态变化,可监听 NSApplication.didChangeScreenParametersNotification 通知实时更新可用屏幕列表
    • 如需限制第二屏窗口不能被用户手动关闭、拖动,保留 styleMask 为 .borderless 即可,不需要额外添加可交互的窗口控制按钮属性

内容的提问来源于stack exchange,提问作者Denny L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:18:03