获取已连接屏幕的名称 Swift

Get the name of a connected screen Swift

有谁知道从连接到系统的显示器获取屏幕名称或型号 name/number 的方法吗?我一直在四处寻找很长一段时间,看看是否有办法做到这一点。我见过任何人的唯一方法 post 只适用于已弃用的 API (CGDisplayIOServicePort),(并且没有列出 API 的替代品),所以那不是'这真的是一个选择。

基本上,我想给用户一个连接屏幕的列表来显示应用程序的输出,我觉得给他们一个显示器名称列表会比任何ID 是从 NSScreenCGGetActiveDisplayList 等返回的。它必须是可能的,当您转到 OS X 中的显示首选项时,它会为您提供那里的显示名称。有人有什么想法吗?

您可以直接从 IOReg 中获取已连接屏幕的名称

func screenNames() -> [String] {

  var names = [String]()
  var object : io_object_t
  var serialPortIterator = io_iterator_t()
  let matching = IOServiceMatching("IODisplayConnect")

  let kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                                matching,
                                                &serialPortIterator)
  if KERN_SUCCESS == kernResult && serialPortIterator != 0 {
    repeat {
      object = IOIteratorNext(serialPortIterator)
      let info = IODisplayCreateInfoDictionary(object, UInt32(kIODisplayOnlyPreferredName)).takeRetainedValue() as NSDictionary as! [String:AnyObject]
      if let productName = info["DisplayProductName"] as? [String:String],
         let firstKey = Array(productName.keys).first {
            names.append(productName[firstKey]!)
      }

    } while object != 0
  }
  IOObjectRelease(serialPortIterator)
  return names
}

let names = screenNames()

macOS 10.15 Catalina 引入了一个新的 属性 localizedName 用于获取外部显示名称:

NSScreen.screens.forEach {
    print([=10=].localizedName)
}