获取连接屏幕Swift的名称

时间:2016-06-22 09:22:03

标签: swift macos display

有没有人知道从连接到系统的显示器获取屏幕名称或型号名称/号码的方法?我一直在四处寻找,看看有没有办法做到这一点。我发现任何人发布的唯一方法仅适用于已弃用的API(CGDisplayIOServicePort),(并且该API未列出替代品),因此这不是一个真正的选项。

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

2 个答案:

答案 0 :(得分:2)

您可以直接从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()

答案 1 :(得分:1)

由于macOS 10.15 Catalina出现了一个新的简单属性localizedName,用于获取外部显示名称:

NSScreen.screens.forEach {
    print($0.localizedName)
}