Я нашел 7 различных способов перечислить мониторы, подключенные к компьютеру. Но все решения дают разные результаты (количество мониторов и информация на каждом мониторе).
Вот эти решения:
Используя знаменитый
EnumDisplayDevices
Использование
EnumDisplayMonitors
Использование инструментария управления Windows (WMI):
С помощью следующего запроса:SELECT * FROM WmiMonitorID
в пространстве именroot\\WMI
.Снова используя WMI < / em>:
С новым запросом:SELECT * FROM Win32_DesktopMonitor
в пространстве именroot\\CIMV2
.Использование Setup API < / em>:
Первым вызовом _ 7_, чтобы затем получить набор информации об устройстве, итеративно с _ 8_Использование графической инфраструктуры DirectX (DXGI)
С первым _ 9_, затем _ 10_Использование Подключение и настройка API дисплеев (CCD):
_ 11_(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
Я тщетно пытался понять разницу между всеми этими методами со ссылкой на MSDN.
Наблюдения
Из того, что я заметил:
- Запросы WmiMonitorID и Setup API возвращают список подключенных (не обязательно активных) дисплеев.
- Запрос Win32_DesktopMonitor WMI возвращает неправильный (по крайней мере, неожиданный) результат (перечисляется только 1 монитор, даже когда он неактивен, а рабочий стол - на другом мониторе).
- EnumDisplayDevices возвращает список активных устройств (кроме случаев, когда активен только 1 монитор с другим подключенным монитором)
- Запросы EnumDisplayMonitors и DXGI возвращают список активных мониторов.
- CCD кажется наиболее надежным методом (дает все возможные пути между целями и источниками).
Вопросы
Какого результата следует ожидать при использовании каждого из этих методов (список подключенных дисплеев, список установленных дисплеев, список активных дисплеев)? Что делать, если я использую зеркальные дисплеи или расширенные дисплеи? Что делать, если в компьютере есть несколько видеокарт без нескольких выходов?
Бонус: некоторые методы (DXGI, EnumDisplayDevices, CCD) используют своего рода иерархию с Adapter - Монитор. Но не дает одинаковых связей между адаптерами и мониторами. Итак, каково определение адаптера для DXGI? для CCD? для EnumDisplayDevices?
GetSystemMetrics(SM_CMONITORS)
считает только видимые мониторы. Это отличается от EnumDisplayMonitors, который перечисляет как видимые дисплеи, так и невидимые псевдо-мониторы, связанные с драйверами зеркалирования. Невидимый псевдо-монитор связан с псевдоустройством, используемым для зеркального отображения рисунка приложения для удаленного взаимодействия или других целей. - person mikew   schedule 10.03.2021