Как определить кол во подключенных мониторов c
Перейти к содержимому

Как определить кол во подключенных мониторов c

  • автор:

Как определить кол во подключенных мониторов c

image
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.

Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции 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

Gray Pipe

Лучший отвечающий
Вопрос

Как програмно определить порядковый номер монитора и попутно координаты этого экрана.
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 не фигурирует.

Как определить все мониторы и их разрешения

image
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.

Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции EnumDisplayDevices мы перебираем все мониторы в текущей сессии пользователя. Потом через if (dc.StateFlags & DISPLAY_DEVICE_ACTIVE) убеждаемся что «монитор» на связи и не спит. Ну и после мы узнаём его имя в dc.DeviceName и может через EnumDisplaySettings бежать по всем доступны разрешениям этого «монитора».
Тестировал подключив к ноуту телек LG: канает, детектит и даже юзает.

UPD: Добавил в условие проверку на параметр DISPLAY_DEVICE_MIRRORING_DRIVER, чтобы отбросить вирт. устройства. Спасибо, shrikus

Как определить кол во подключенных мониторов c

image
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.

[Gentoo] Количество подключённых мониторов

Можно ли как-нибудь из скрипта определить сколько мониторов подключено к двухголовой видео карте? Видео карта может быть как нвидиа так ати или интел, поэтому желательно без обращения к функциям драйверов.

С двумя мониторами написал, что монитор один. А вот нвидиа в Xorg.0.log увидила 2 CRT монитора. В любом случае спасибо за подсказку. Завтра поэкспериментирую.

xrandr покажет как один большой если стоит xinerama или нвидивская twinview.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *