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

Cocoa Swift中如何无需点击图标判断App是否有可见窗口?

判断NSApplication是否存在可见窗口(无需点击应用图标)

在AppDelegate中有如下方法:

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
    return true
}

通过该方法可获取hasVisibleWindows的布尔值,但此方法需点击应用图标才会触发。我希望无需点击图标,在方法外部获取该值,请问是否有其他方式判断NSApplication.shared是否存在可见窗口?

解决方案代码示例

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
    
    private lazy var window1: NSWindow = NSWindow()
    private lazy var window2: NSWindow = NSWindow()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        buildWindow()
    }
    
    private func buildWindow() {
        window1 = makeWindow(title: "窗口1", isReleasedWhenClosed: false)
        window2 = makeWindow(title: "窗口2", isReleasedWhenClosed: false)

        // 你可以关闭或最小化所有窗口,此时会返回false;只要保留至少一个窗口打开,就会返回true
        // 你可以在5秒内进行各种操作测试,比如关闭两个窗口、最小化两个窗口等
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(5)) {
            print(nsApplication.hasVisibleWindows)
        }
    }
}

@discardableResult
func makeWindow(title: String, isReleasedWhenClosed: Bool) -> NSWindow {
    let window: NSWindow = NSWindow()
    window.styleMask = [.titled, .closable, .miniaturizable, .resizable]
    window.backingType = .buffered
    window.isReleasedWhenClosed = isReleasedWhenClosed
    
    window.setFrame(CGRect(origin: .zero, size: CGSize(width: 400.0, height: 200.0)), display: true)
    window.title = title
    window.center()
    window.setFrameAutosaveName(window.title)
    window.isMovableByWindowBackground = true
    window.makeKeyAndOrderFront(window)
    return window
}

extension NSApplication {
    var hasVisibleWindows: Bool {
        for window in NSApplication.shared.orderedWindows {
            if window.isVisible { return true }
        }
        return false
    }
}

// 主程序部分
let nsApplication: NSApplication = NSApplication.shared
let appDelegate: AppDelegate = AppDelegate()
nsApplication.delegate = appDelegate
nsApplication.run()

代码说明

  • 给NSApplication扩展一个计算属性hasVisibleWindows,遍历应用的所有有序窗口,检查是否存在可见窗口
  • 当所有窗口被关闭或最小化时,hasVisibleWindows返回false;只要有一个窗口处于可见状态(未关闭、未最小化),就返回true
  • 示例代码会在应用启动5秒后打印当前判断结果,你可以在这5秒内操作窗口测试不同场景

内容的提问来源于stack exchange,提问作者swiftPunk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:35:25