Date: 05.03.2018 11:10:41
Есть два WMI-класса, Win32_DesktopMonitor (в root\\CIMV2) и WmiMonitorID (root\\WMI). Один из них должен давать полный список физических мониторов (Пример работы с WMI)
"не плохо было бы если у виндовс было бы какое нить сабытие которое сигнализировало что подключился какой нить монитор"
Оно есть (правда не для мониторов конкретно, а для всех устройств):
Сообщение WM_DEVICECHANGE с кодом DBT_DEVNODES_CHANGED. Рассылается всем окнам верхнего уровня при любом отключении или подключении устройства. В WinForms легко его обработать, переопределяя WndProc у формы.
Date: 05.03.2018 11:56:24
Насколько я знаю, порядкового номера монитора как отдельного параметра не существует. Панель управления их генерирует на лету, просто для наглядности, но в системе они нигде не прописаны. Соответственно нет и способа их получить программно.
Если нужно просто отличить один монитор от другого, можно использовать DeviceID или серийный номер из данных WMI. На основе их уже построить свою таблицу с номерами и их показывать пользователю.
Date: 06.03.2018 17:08:53
"А еще какие нить Win информацию о мониторах дают?"
Да, целый мешок. Посмотрите здесь. Из перечисленных для вас будут явно бесполезны EnumDisplayMonitors (так как она дает то же самое, что Screen.AllScreens в .NET) и Setup API (он даст только то, что отображается в диспетчере устройств). Все остальное более-менее заслуживает рассмотрения, хотя будет и трудновато задекларировать это все для C#.
"а то у Win32_DesktopMonitor и WmiMonitorID InstanceName и PNPDeviceID почти похожи но все равно разные, даже объединить нету по какому либо параметру."
Ну, видимо, приходиться признать, что InstanceName это PNPDeviceID + некоторая приписка, и так их сравнивать. Нигде больше это InstanceName не фигурирует.
Автор: VadimTagil