Я разрабатываю приложение, которое будет отображать информацию, полученную из блоков 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, однако я пока его не нашел.