我正在尝试检索连接到我的 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 值映射到它们各自的本地化名称?任何有关这方面的指导将不胜感激!
我按照@Willeke的建议尝试:
import Cocoa
import Combine
_ = NSApplication.shared
while true {
RunLoop.main.acceptInput(forMode: .default, before: .distantPast)
let displayList: [String] = getDisplayNames()
print(displayList)
}
如插入新显示器时 NSScreen 不更新显示器计数中所述并按预期工作