Ищу надежное сопоставление Forms.Screen.DeviceName с информацией EDID монитора

Я разрабатываю приложение, которое будет отображать информацию, полученную из блоков EDID, (модель монитора, идентификатор, серийный номер и т. д. )в диалоговом окне на соответствующий монитор.

Этот код работает для поиска информации EDID для дисплеев. Он извлекает информацию EDID путем перечисления ключей DISPLAY в HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY\[Monitor]\[PnPID]\Device Parameters\EDID .

Обновление:Приведенный выше код основан на «побочных эффектах» использования реестра PnP. Теперь я использую SetupAPI для перечисления мониторов, который правильно обрабатывает подключение/удаление мониторов (, в отличие от кода из приведенной выше ссылки.)

Я пытаюсь сопоставить каждый экран в Windows.Forms.Screen.AllScreens[] (\\.\DISPLAY1, \\.\DISPLAY2 и т. д. )с записями, полученными в результате вышеуказанной проверки реестра.

Примечание:В приведенном ниже блоке кода DisplayDetails.GetMonitorDetails()теперь заменен более надежным кодом перечисления реестра с использованием SetupAPI, но возвращаемые данные остаются теми же.

напр.

private void Form1_Load(object sender, EventArgs e)
{
    Console.WriteLine("Polling displays on {0}:", System.Environment.MachineName);
    int i = 0;
    foreach ( DisplayDetails dd in DisplayDetails.GetMonitorDetails())
    {
        Console.WriteLine( "Info: Model: {0}, MonitorID: {1}, PnPID: {2}, Serial#:{3}", dd.Model, dd.MonitorID, dd.PnPID, dd.SerialNumber );
        Console.WriteLine( "Does this correlate to Screen: {0}?", Screen.AllScreens[i++].DeviceName );
    }
}

Выход:

Информация:Модель:DELL P2411H, MonitorID:DELA06E, PnPID:5&2e2fefea&0&UID1078018, Серийный номер#:F8NDP0C...PU

Соотносится ли это с экраном:\\.\ДИСПЛЕЙ1?

Информация:Модель:DELL P2411H, MonitorID:DELA06E, PnPID:5&2e2fefea&0&UID1078019, Серийный номер#:F8NDP0C...AU

Соответствует ли это экрану:\\.\ ДИСПЛЕЙ2?


Ответ:НЕТ

При тестировании я обнаружил, что они не могут надежно коррелировать. (У меня есть система, в которой первым пронумерованным дисплеем является \\.\DISPLAY2).

Мой вопрос: Есть ли способ надежно получить информацию EDID для данного Forms.Screen?Я могу получить блок EDID, но не нашел способа сопоставить его с формой верхнего-уровня пользовательского интерфейса. Подсказки пользователю нежелательны, так как в моем случае использования два (или более)монитора, скорее всего, будут одной модели и разрешения, а их серийный номер будет отличаться всего несколькими цифрами.

Я искал пути, следующие за Forms.Screen API, Win32 EnumDisplay, другими GUID реестра, (PnP и драйверами-, связанными), но не нашел перспективных путей.

Я также изучил WMI Win32_DesktopMonitor API (Windows 7), однако, похоже, у него нет дополнительной информации, которая помогла бы мне сопоставить его с Windows.Forms.Screen.AllScreens. [] записи.

Подозреваю, что если и есть способ сделать это, то через SetupAPI, однако я пока его не нашел.

6
задан holtavolt 24 April 2012 в 12:50
поделиться