如何在第二个屏幕(第二个显示器)上打开新的 window

How to open new window on second screen (second display)

任务很简单,但我不知道从哪里开始寻找具有两个显示器的 MacOs 应用程序开发的任何指针。我正在构建一个演示应用程序,其中主应用程序将显示在主显示器上,按下一个按钮我需要将全屏 window 推到第二个显示器或第二个显示器上。我该怎么做呢?我正在使用 SwiftUI,但我愿意接受其他建议。

经过一些修改后,我发现了这个解决方案,我对其进行了修改以使其适用于我。添加以下扩展名。

extension View {
    private func newWindowInternal(with title: String) -> NSWindow {
        let window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 0, height: 0),
            styleMask: [.closable, .borderless],
            backing: .buffered,
            defer: false)
        
        guard let secondScreen = NSScreen.screens.last else {
            print("Failed to find last display")
            return window
        }
        
        window.setFrame(secondScreen.frame, display: true)
        window.level = NSWindow.Level.screenSaver
        window.isReleasedWhenClosed = false
        window.title = title
        window.orderFront(nil)
        return window
    }
    
    func openNewWindow(with title: String = "new Window") {
        self.newWindowInternal(with: title).contentView = NSHostingView(rootView: self)
    }
}

在您的 ContentView 中,添加一个将触发激活新 window 的按钮。这是一个例子 ContentView

struct ContentView: View {
    @State private var windowOpened = false
    
    var body: some View {
        VStack {
            Button("Open window") {
                if !windowOpened {
                    ProjectorView(isOpen: $windowOpened).openNewWindow(with: "Projector")
                }
            }
            .keyboardShortcut("o", modifiers: [.option, .command])
            
            Button("Close window") {
                NSApplication.shared.windows.first(where: { [=11=].title == "Projector" })?.close()
            }
            .keyboardShortcut("w", modifiers: [.option, .command])
        }
        .frame(width: 300, height: 100)
    }
}

最后,这是 ProjectorView 的样子。

struct ProjectorView: View {
    @Binding var isOpen: Bool
    
    var body: some View {
        HStack {
            Spacer()
            VStack {
                Spacer()
                Text("Hello World!")
                    .font(.title2)
                Spacer()
            }
            Spacer()
        }
        .padding()
        .onDisappear {
            isOpen = false
        }
        .onAppear {
            isOpen = true
        }
    }
}

这个解决方案效果很好。按 O 将在第二个屏幕上打开 ProjectorView 所有其他 windows 并按下 W 将关闭 ProjectorView window . Window 设置,window 级别可以在扩展中调整。

在 macOS Monterey、Xcode 13、Apple M1 MacBook Air 上测试。