Получение модели и серийного номера монитора из Extended Display Identification Data (EDID)

      Extended Display Identification Data (EDID) — стандарт формата данных VESA, который содержит базовую информацию о мониторе и его возможностях, включая информацию о производителе, максимальном размере изображения, цветовых характеристиках, заводских предустановленных таймингах, границах частотного диапазона, а также строках, содержащих название монитора и серийный номер. Информация сохраняется в мониторе и используется для обмена данными с системой через канал экранных данных (англ. DDC, Display Data Channel), который находится между монитором и графическим адаптером. Система использует эту информацию в конфигурационных целях, в итоге монитор и система могут работать вместе синхронизировано. Последняя версия EDID (версия 1.3) может быть использована в ЭЛТ-мониторах, ЖК-мониторах, а также будущих типах мониторов, так как EDID предлагает общее описание почти всех параметров монитора.
      Для просмотра информации о вашем мониторе, запустите редактор реестра. Откройте меню Пуск -> Все программы -> Стандартные -> Выполнить (или нажмите сочетание клавиш Win+R), введите команду regedit и нажмите кнопку «ОК». Перейдите по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\ ID монитора \Device Parameters\, в этом подкаталоге находится единственный параметр EDID, с типом данных REG_BINARY. В нем хранятся необработанные двоичные данные.
      Эти данные можно просмотреть в редакторе реестра в шестнадцатеричном формате. Если вы откроете данный параметр, сделав двойной клик левой клавишей мыши по нему, то увидите с левой стороны двоичные данные, а с правой их расшифровку. Ниже представлен пример таких данных, здесь вы можете сразу увидеть серийный номер, а затем модель вашего монитора.
      На самом деле в данном параметре содержится гораздо больше информации, чем отображает редактор реестра.
      Для просмотра полной информации о подключенных к вашему компьютеру мониторов вы можете воспользоваться программой Monitor Asset Manager (ссылка на оф. сайт http://www.entechtaiwan.com/util/moninfo.shtm).
Дополнительную информацию о формате данных EDID вы можете посмотреть по ссылке http://en.wikipedia.org/wiki/EDID.
      В данной инструкции будет описан способ получения из реестра серийного номера и модели активного (подключенного в данный момент) монитора. Создайте проект Windows Form в Microsoft Visual Studio. Нажмите клавишу «F7» и перейдите в листинг главной формы. Добавьте приведенный ниже метод:
private void MonitorInfo()
{           
    Microsoft.Win32.RegistryKey Display = Microsoft.Win32.Registry.LocalMachine;
    Boolean bFailed = false;
    try
    {
        Display = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\DISPLAY");
    }
    catch
    {
        bFailed = true;
    }
    
    if (!bFailed & (Display != null))
    {
        foreach (string sMonitorID in Display.GetSubKeyNames())
        {
            RegistryKey MonitorID = Display.OpenSubKey(sMonitorID);

            if (MonitorID != null)
            {                        
                foreach (string sPNPID in MonitorID.GetSubKeyNames())
                {
                    RegistryKey PnPID = MonitorID.OpenSubKey(sPNPID);
                    if (PnPID != null)
                    {
                        string[] sSubkeys = PnPID.GetSubKeyNames();
                       
                        if (sSubkeys.Contains("Control"))
                        {
                            if (sSubkeys.Contains("Device Parameters"))
                            {
                                RegistryKey DevParam = 
                                 PnPID.OpenSubKey("Device Parameters");
                                string sSerial = "";
                                string sModel = "";                                    

                                string sSerFind =
                                  new string(new char[] { 
                                                (char)00,
                                                (char)00, 
                                                (char)00, 
                                                (char)0xff });
                                string sModFind =
                                  new string(new char[] { 
                                                (char)00,
                                                (char)00,
                                                (char)00,
                                                (char)0xfc }); 
                                byte[] bObj = DevParam.GetValue("EDID", null) as byte[];
                                if (bObj != null)
                                {                                            
                                    string[] sDescriptor = new string[4];
                                    Encoding ANSI = Encoding.GetEncoding(1252);
                                    sDescriptor[0] = ANSI.GetString(bObj, 0x36, 18);
                                    sDescriptor[1] = ANSI.GetString(bObj, 0x48, 18);
                                    sDescriptor[2] = ANSI.GetString(bObj, 0x5A, 18);
                                    sDescriptor[3] = ANSI.GetString(bObj, 0x6C, 18);  

                                    //Search the Keys
                                    foreach (string sDesc in sDescriptor)
                                    {
                                        if (sDesc.Contains(sSerFind))
                                        {
                                            sSerial = 
                                             sDesc.Substring(4).Replace("\0","").Trim();
                                        }
                                        if (sDesc.Contains(sModFind))
                                        {
                                            sModel =
                                             sDesc.Substring(4).Replace("\0","").Trim();
                                        }                                               
                                    }
                                }
                                if (!string.IsNullOrEmpty(sPNPID + sSerFind + sModel + sMonitorID))
                                {
                                    MessageBox.Show(
                                         "Модель: " + sModel 
                                           + Environment.NewLine + 
                                          "Серийный номер: " + sSerial);   
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
      Для вызова этого метода добавьте на форму компонент «Button» и сделайте двойной клик по нему, вы перейдите в автоматический метод button1_Click. Добавьте в него вызов метода «MonitorInfo();».
      Запустите приложение, нажав на клавиатуре клавишу «F5». Нажмите на единственную кнопку на вашего приложения. Если вы все сделали правильно, то у вас появится диалоговое окно с моделью и серийным номером вашего монитора, в случае если мониторов несколько, то сообщений будет столько же.

Ссылка для скачивания примера: Яндекс.Диск


Дополнительные материалы: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!