2016-06-22 6 views
1

Кто-нибудь знает, как получить имя экрана или имя/номер модели с дисплея, подключенного к системе? Я довольно долго смотрел вокруг, чтобы понять, есть ли способ сделать это. Единственный метод, который я видел, когда кто-либо отправляет сообщения, работает только с устаревшим API (CGDisplayIOServicePort) (и для этого API нет замены), так что это не вариант.Получить имя подключенного экрана Swift

В принципе, я хочу предоставить пользователю список подключенных экранов для отображения вывода приложения, и я чувствую, что предоставление им списка имен дисплеев будет намного более элегантным и приятным, чем любой идентификатор то есть возвращается с NSScreen или CGGetActiveDisplayList и т. д. Он должен, когда вы переходите к настройкам отображения в OS X, он дает вам имена дисплеев. У кого-нибудь есть идеи?

ответ

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() 
+0

Это потрясающе! Спасибо, он работает отлично. Я искал дни для чего-то, что бы это сделало, может быть, я просто не искал правильных вещей. – bshock84

+0

Добро пожаловать. Вероятно, вы смотрели только в «Quartz Display Services», но API-интерфейса нет, чтобы получить имя продукта для отображения. – vadian

+0

Вот где я искал, там и класс «NSScreen». Я собираюсь сделать много чтения на всех API в вашем коде, чтобы, надеюсь, понять все это немного лучше. – bshock84