如何使用 Swift 获取 macOS 中连接显示器的显示名称

问题描述 投票:0回答:1

我正在尝试检索连接到我的 Mac 的显示器名称列表。使用

NSScreen
,我可以获得如下列表:

func getDisplayNames() -> [String] {
    var names = [String]()
    guard !NSScreen.screens.isEmpty else {
        printLog("S3", "No displays are connected.")
        return names
    }
    
    NSScreen.screens.forEach {
        names.append($0.localizedName)
    }
    
    printLog("S3", "Connected to the following displays: \(names)")
    return names
}

但是,如果程序仍在运行并且我断开了外部显示器的连接,则在循环的下一次迭代中返回的列表将保持不变,就好像显示器仍处于连接状态一样。例如,如果连接外部显示器时列表为

["LG IPS FULLHD", "Built-in Retina Display"]
,则当外部显示器断开连接时列表应变为
["Built-in Retina Display"]
。相反,它保持为
["LG IPS FULLHD", "Built-in Retina Display"]

我发现使用

CGGetOnlineDisplayList
可以正常工作:

import CoreGraphics

func getOnlineDisplays() {
    let maxDisplays: UInt32 = 10
    var onlineDisplays = [CGDirectDisplayID](repeating: 0, count: Int(maxDisplays))
    var displayCount: UInt32 = 0
    
    let error = CGGetOnlineDisplayList(maxDisplays, &onlineDisplays, &displayCount)
    
    if error == .success {
        print("Number of online displays: \(displayCount)")
        
        for i in 0..<displayCount {
            print("Display ID \(i): \(onlineDisplays[Int(i)])")
        }
    } else {
        print("Error retrieving online displays: \(error)")
    }
}

// Call the function to get online displays
getOnlineDisplays()

如所述在此处输入链接描述,这将正确返回 ID(未连接显示器时返回一个 ID,连接显示器时返回两个 ID)。不过我还没有找到将显示ID转换成对应显示名称的方法。

问题: 有没有办法将 CGGetOnlineDisplayList 返回的 CGDirectDisplayID 值映射到它们各自的本地化名称?任何有关这方面的指导将不胜感激!

swift macos graphics display appkit
1个回答
0
投票

我按照@Willeke的建议尝试:

import Cocoa
import Combine

_ = NSApplication.shared

while true {
    RunLoop.main.acceptInput(forMode: .default, before: .distantPast)
    let displayList: [String] = getDisplayNames()
    print(displayList)
}

插入新显示器时 NSScreen 不更新显示器计数中所述并按预期工作

© www.soinside.com 2019 - 2024. All rights reserved.