Я нашел 7 различных способов перечислить мониторы, подключенные к компьютеру. Но все решения дают разные результаты (количество мониторов и информация на каждом мониторе).
Эти решения:
-
Используя знаменитый
EnumDisplayDevices
-
Использование
EnumDisplayMonitors
-
Использование Инструментарий управления Windows (WMI):
Со следующим запросом:SELECT * FROM WmiMonitorID
в пространстве именroot\\WMI
. -
Снова используя WMI:
С новым запросом:SELECT * FROM Win32_DesktopMonitor
в пространстве именroot\\CIMV2
. -
Используя API установки:
Сначала вызовитеSetupDiGetClassDevs
, чтобы получить информацию об устройстве, затем, итерации с помощьюSetupDiEnumDeviceInfo
-
Использование DirectX Graphics Infrastructure (DXGI)
С первымIDXGIFactory::EnumAdapters
, затемIDXGIAdapter::EnumOutput
-
Используя API-интерфейсы подключения и настройки дисплеев (CCD):
QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
Я попытался точно понять разницу между всеми тезисами методов с ссылкой MSDN, тщетно.
Наблюдения
Из того, что я наблюдал:
- Запросы WmiMonitorID и Setup API возвращают список подключенных (не обязательно активных) дисплеев.
- Запрос WMI Win32_DesktopMonitor возвращает неверный (по крайней мере неожиданный) результат (только один монитор перечислил, даже если он неактивен, и рабочий стол на другом мониторе).
- EnumDisplayDevices возвращает список активных устройств (кроме случаев, когда активен только один монитор с подключенным другим монитором)
- EnumDisplayMonitors и запросы DXGI возвращают список активных мониторов.
- CCD представляется наиболее надежным методом (дает все возможные пути между целями и источниками).
Вопросы
Какой результат я должен ожидать при использовании каждого из этих методов (список подключенных дисплеев, список установленных дисплеев, список активных дисплеев)? Что делать, если я использую дисплеи Mirrored или расширенные дисплеи? Что делать, если на компьютере имеется несколько видеокарт без нескольких выходов?
Бонус: Некоторые методы (DXGI, EnumDisplayDevices, CCD) используют своего рода иерархию с адаптером-монитором. Но не дает одинаковых связей между адаптерами и мониторами. Итак, каково определение адаптера для DXGI? для ПЗС? для EnumDisplayDevices?