Ответы с форумов MSDN

Получение информации о мониторах в C#

Date: 05.03.2018 11:10:41

Есть два WMI-класса, Win32_DesktopMonitor (в root\\CIMV2) и WmiMonitorID (root\\WMI). Один из них должен давать полный список физических мониторов (Пример работы с WMI)

"не плохо было бы если у виндовс было бы какое нить сабытие которое сигнализировало что подключился какой нить монитор"

Оно есть (правда не для мониторов конкретно, а для всех устройств): Сообщение WM_DEVICECHANGE с кодом DBT_DEVNODES_CHANGED. Рассылается всем окнам верхнего уровня при любом отключении или подключении устройства. В WinForms легко его обработать, переопределяя WndProc у формы.


Message 509

Date: 05.03.2018 11:56:24

Насколько я знаю, порядкового номера монитора как отдельного параметра не существует. Панель управления их генерирует на лету, просто для наглядности, но в системе они нигде не прописаны. Соответственно нет и способа их получить программно.

Если нужно просто отличить один монитор от другого, можно использовать DeviceID или серийный номер из данных WMI. На основе их уже построить свою таблицу с номерами и их показывать пользователю.

Message 508

Date: 06.03.2018 17:08:53

"А еще какие нить Win информацию о мониторах дают?"

Да, целый мешок. Посмотрите здесь. Из перечисленных для вас будут явно бесполезны EnumDisplayMonitors (так как она дает то же самое, что Screen.AllScreens в .NET) и Setup API (он даст только то, что отображается в диспетчере устройств). Все остальное более-менее заслуживает рассмотрения, хотя будет и трудновато задекларировать это все для C#.

"а то у Win32_DesktopMonitor  и WmiMonitorID  InstanceName и PNPDeviceID почти похожи но все равно разные, даже объединить нету по какому либо параметру."

Ну, видимо, приходиться признать, что InstanceName это PNPDeviceID + некоторая приписка, и так их сравнивать. Нигде больше это  InstanceName не фигурирует.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub