Как определить все мониторы и их разрешения
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции EnumDisplayDevices мы перебираем все мониторы в текущей сессии пользователя. Потом через if (dc.StateFlags & DISPLAY_DEVICE_ACTIVE) убеждаемся что «монитор» на связи и не спит. Ну и после мы узнаём его имя в dc.DeviceName и может через EnumDisplaySettings бежать по всем доступны разрешениям этого «монитора».
Тестировал подключив к ноуту телек LG: канает, детектит и даже юзает.
UPD: Добавил в условие проверку на параметр DISPLAY_DEVICE_MIRRORING_DRIVER, чтобы отбросить вирт. устройства. Спасибо, shrikus
Определение количества подключенных мониторов всегда возвращает 1 или более вместо 0
У меня есть приложение для Windows, которому необходимо определять правильное количество подключенных мониторов во время выполнения.
Пока что все методы, которые мне удалось найти в Интернете и Stack Overflow, не дали результата. Все они возвращают 1 независимо от того, действительно ли подключен экран. И когда подключены 2 экрана, некоторые из них правильно возвращают 2, однако ни один из них не возвращает 0, если экраны не подключены. Мне нужно, чтобы он возвращал 0, когда экран не подключен.
Даже метод, который определяет, подключен ли экран, будет работать.
Ниже приведен список кода из 6 методов, которые я пробовал.
Если есть какие-либо другие надежные методы определения правильного количества дисплеев, я был бы признателен за помощь.
Кстати, EDID_OVERRIDE в реестре для Default_Monitor установлен так, что, что бы ни случилось, EDID не изменится. Это не то, что я могу изменить. Но возможно, именно по этой причине Windows сообщает, что монитор есть, хотя на самом деле его нет. Это означало бы, что он считает мониторы не по количеству фактически подключенных, а по количеству дисплеев, на которые, по его мнению, выполняется рендеринг.
Учитывая это подозрение, есть ли метод, с помощью которого я могу определить количество фактически подключенных мониторов? Например, сколько кабелей HDMI / DVI / VGA подключено, в отличие от того, на сколько экранов, по мнению Windows, выполняется рендеринг?
Кстати, отличный вопрос. Я исчерпал свои возможности тестирования и поиска в Google. Я бы просто начал собирать всю информацию о winapi, касающуюся дисплеев и адаптеров, и начал бы писать что-то, чтобы просто зациклить и распечатать это.
@TheSoftwareJedi — Один из методов действительно использовал winapi, в частности функцию EnumDisplayMonitors: docs.microsoft.com/en-us/windows/desktop/api/winuser/… — Тем не менее, если немного поиграть в api, это может дать мне некоторые полезные результаты, но я не надеюсь.



Ответы 1
После долгих повозок и царапин в голове мне удалось создать функцию, которая надежно возвращает правильное количество подключенных экранов, даже если это число меняется во время работы программы, и даже если количество подключенных экранов равно 0.
Это означает, что его также можно использовать для определения того, подключен ли экран / дисплей / монитор к компьютеру вообще.
Функция:
Детали и объяснение (если хотите)
Вышеупомянутая функция представляет собой смесь Франкенштейна метода 5 и метода 6 (см. Вопрос).
Сначала он получает количество мониторов из метода 5, который надежно давал правильное число, когда количество подключенных мониторов было больше 0 (по крайней мере, с мониторами, которые я тестировал). Однако он возвращает 1, когда фактически подключено 0 мониторов.
Во-вторых, он получает имя одного из активных мониторов через модифицированную версию метода 6. Метод 6 использует WmiMonitorBasicDisplayParams класс для получения информации о подключенных мониторах. Сначала он проверяет, активен ли монитор. Если это так, то он получит имя экземпляра монитора. Имя экземпляра имеет форму, которая выглядит как DISPLAY\(monitorNameHere)\(seeminglyRandomValuesHere) .
Если подключен только один монитор и имя экземпляра этого монитора содержит «Default_Monitor», это означает, что в настоящее время не подключены действительные мониторы, и функция возвращает 0.
«Default_Monitor» — это имя, которое Windows дает «монитору», который отображается, когда мониторы не обнаружены. (по крайней мере, нет мониторов, которые выдают действительный EDID)
Теперь, возможно, причина, по которой исходные функции у меня не работали, заключалась в том, что у меня Default_Monitor установлен на собственный EDID. Однако я думаю, что эта функция все равно будет надежной.
Эта функция также отлично подходит для определения того, подключен ли экран / дисплей / монитор (потому что в противном случае он возвращает 0), что я также не смог найти нигде в Интернете, что заставило меня поверить, что эти функции не вернули бы 0, даже если бы у меня не было настроено EDID для Default_Monitor.
Как определить кол во подключенных мониторов c
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.
Как определить, что подключено 2 монитора ? В моём случае 2-ой монитор является продолжением первого (не дублирование).