Как определить кол во подключенных мониторов c
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции EnumDisplayDevices мы перебираем все мониторы в текущей сессии пользователя. Потом через if (dc.StateFlags & DISPLAY_DEVICE_ACTIVE) убеждаемся что «монитор» на связи и не спит. Ну и после мы узнаём его имя в dc.DeviceName и может через EnumDisplaySettings бежать по всем доступны разрешениям этого «монитора».
Тестировал подключив к ноуту телек LG: канает, детектит и даже юзает.
UPD: Добавил в условие проверку на параметр DISPLAY_DEVICE_MIRRORING_DRIVER, чтобы отбросить вирт. устройства. Спасибо, shrikus
Как узнать количество дисплеев в windows?
Я хочу подсчитать количество активных дисплеев. Для Mac я могу использовать следующее:
Как я могу добиться того же в Windows? Я нашелEnumDisplayMonitors , но не могу понять, как его использовать.
2 ответов:
Как вы обнаружили, EnumDisplayMonitors() будет делать свою работу, но это немного сложно, чтобы позвонить. В документации говорится:
Функция EnumDisplayMonitors перечисляет мониторы отображения (включая невидимые псевдомониторы, связанные с драйверами зеркального отображения), которые пересекают область, образованную пересечением указанного прямоугольника отсечения и видимой области контекста устройства. EnumDisplayMonitors вызывает определяемую приложением функцию обратного вызова MonitorEnumProc один раз для каждого перечисленного монитора. Обратите внимание, что GetSystemMetrics (SM_CMONITORS) учитывает только мониторы дисплея.
В качестве иллюстрации вызова EnumDisplayMonitors() попробуйте следующее:
Не тестируется, но по существу вам нужно только предоставить обратный вызов для функции enum:
Как определить кол во подключенных мониторов c
Лучший отвечающий
Вопрос
Как програмно определить порядковый номер монитора и попутно координаты этого экрана.
System.Windows.Forms.Screen.AllScreens не подошол если мониторы выбрать как дублирующие то будет только 1 монитор а второй который дублирует пропадает из этого списка.
А мне нужны все работающие мониторы с их порядковым номером, разрешением и координатами расположения мониторов. Ну и в добавок не плохо было бы если у виндовс было бы какое нить сабытие которое сигнализировало что подключился какой нить монитор или отключился
- Изменено КВА696 5 марта 2018 г. 4:30
Ответы
Есть два WMI-класса, Win32_DesktopMonitor (в root\\CIMV2) и WmiMonitorID (root\\WMI). Один из них должен давать полный список физических мониторов (Пример работы с WMI)
"не плохо было бы если у виндовс было бы какое нить сабытие которое сигнализировало что подключился какой нить монитор"
Оно есть (правда не для мониторов конкретно, а для всех устройств): Сообщение WM_DEVICECHANGE с кодом DBT_DEVNODES_CHANGED. Рассылается всем окнам верхнего уровня при любом отключении или подключении устройства. В WinForms легко его обработать, переопределяя WndProc у формы.
- Изменено VadimTagil 5 марта 2018 г. 11:12
- Помечено в качестве ответа КВА696 5 марта 2018 г. 11:28
Все ответы
Есть два WMI-класса, Win32_DesktopMonitor (в root\\CIMV2) и WmiMonitorID (root\\WMI). Один из них должен давать полный список физических мониторов (Пример работы с WMI)
"не плохо было бы если у виндовс было бы какое нить сабытие которое сигнализировало что подключился какой нить монитор"
Оно есть (правда не для мониторов конкретно, а для всех устройств): Сообщение WM_DEVICECHANGE с кодом DBT_DEVNODES_CHANGED. Рассылается всем окнам верхнего уровня при любом отключении или подключении устройства. В WinForms легко его обработать, переопределяя WndProc у формы.
- Изменено VadimTagil 5 марта 2018 г. 11:12
- Помечено в качестве ответа КВА696 5 марта 2018 г. 11:28
Только надо добавить ссылки на сборки: System.Windows.Forms и System.Drawing
За WmiMonitorID огромное спасибо, это даже лучше по моему чем копаться в EDID надо только проверить что он даст, но вот с ходу не нахожу кто мне даст порядковый номер который раздает виндовс кто под номером 1 кто под номером 2 и т.д.
- Изменено КВА696 5 марта 2018 г. 11:29
Насколько я знаю, порядкового номера монитора как отдельного параметра не существует. Панель управления их генерирует на лету, просто для наглядности, но в системе они нигде не прописаны. Соответственно нет и способа их получить программно.
Если нужно просто отличить один монитор от другого, можно использовать DeviceID или серийный номер из данных WMI. На основе их уже построить свою таблицу с номерами и их показывать пользователю.
А еще какие нить Win информацию о мониторах дают? а то в Win32_DesktopMonitor нету координат расположение монитора по X и Y(под координатами понимаю у Screen Bounds.X и Bounds.Y ). и не плохо было бы если было бы что то общее с WmiMonitorID.
а то у Win32_DesktopMonitor и WmiMonitorID InstanceName и PNPDeviceID почти похожи но все равно разные, даже объединить нету по какому либо параметру.
- Изменено КВА696 6 марта 2018 г. 7:03
"А еще какие нить Win информацию о мониторах дают?"
Да, целый мешок. Посмотрите здесь. Из перечисленных для вас будут явно бесполезны EnumDisplayMonitors (так как она дает то же самое, что Screen.AllScreens в .NET) и Setup API (он даст только то, что отображается в диспетчере устройств). Все остальное более-менее заслуживает рассмотрения, хотя будет и трудновато задекларировать это все для C#.
"а то у Win32_DesktopMonitor и WmiMonitorID InstanceName и PNPDeviceID почти похожи но все равно разные, даже объединить нету по какому либо параметру."
Ну, видимо, приходиться признать, что InstanceName это PNPDeviceID + некоторая приписка, и так их сравнивать. Нигде больше это InstanceName не фигурирует.
Как определить все мониторы и их разрешения
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции EnumDisplayDevices мы перебираем все мониторы в текущей сессии пользователя. Потом через if (dc.StateFlags & DISPLAY_DEVICE_ACTIVE) убеждаемся что «монитор» на связи и не спит. Ну и после мы узнаём его имя в dc.DeviceName и может через EnumDisplaySettings бежать по всем доступны разрешениям этого «монитора».
Тестировал подключив к ноуту телек LG: канает, детектит и даже юзает.
UPD: Добавил в условие проверку на параметр DISPLAY_DEVICE_MIRRORING_DRIVER, чтобы отбросить вирт. устройства. Спасибо, shrikus
Как определить кол во подключенных мониторов c
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
[Gentoo] Количество подключённых мониторов
Можно ли как-нибудь из скрипта определить сколько мониторов подключено к двухголовой видео карте? Видео карта может быть как нвидиа так ати или интел, поэтому желательно без обращения к функциям драйверов.
С двумя мониторами написал, что монитор один. А вот нвидиа в Xorg.0.log увидила 2 CRT монитора. В любом случае спасибо за подсказку. Завтра поэкспериментирую.
xrandr покажет как один большой если стоит xinerama или нвидивская twinview.