Подтвердить что ты не робот

Перечисление мониторов на компьютере

Я нашел 7 различных способов перечислить мониторы, подключенные к компьютеру. Но все решения дают разные результаты (количество мониторов и информация на каждом мониторе).

Эти решения:

Я попытался точно понять разницу между всеми тезисами методов с ссылкой MSDN, тщетно.

Наблюдения

Из того, что я наблюдал:

  • Запросы WmiMonitorID и Setup API возвращают список подключенных (не обязательно активных) дисплеев.
  • Запрос WMI Win32_DesktopMonitor возвращает неверный (по крайней мере неожиданный) результат (только один монитор перечислил, даже если он неактивен, и рабочий стол на другом мониторе).
  • EnumDisplayDevices возвращает список активных устройств (кроме случаев, когда активен только один монитор с подключенным другим монитором)
  • EnumDisplayMonitors и запросы DXGI возвращают список активных мониторов.
  • CCD представляется наиболее надежным методом (дает все возможные пути между целями и источниками).

Вопросы

Какой результат я должен ожидать при использовании каждого из этих методов (список подключенных дисплеев, список установленных дисплеев, список активных дисплеев)? Что делать, если я использую дисплеи Mirrored или расширенные дисплеи? Что делать, если на компьютере имеется несколько видеокарт без нескольких выходов?

Бонус: Некоторые методы (DXGI, EnumDisplayDevices, CCD) используют своего рода иерархию с адаптером-монитором. Но не дает одинаковых связей между адаптерами и мониторами. Итак, каково определение адаптера для DXGI? для ПЗС? для EnumDisplayDevices?

4b9b3361

Ответ 1

Я не знаю всех этих API, но я помню некоторые из них (плохие воспоминания), так что вот что я могу запомнить и найти из-за того, что выкалывание в MSDN и игра с wbemtest, которого я удивляюсь, я даже помню. Я понимаю, что этот ответ, вероятно, не ВСЕ, на что вы надеялись.

Для иллюстраций ниже (и все эти иллюстрации приведены на моем ноутбуке Dell Latitude, я набираю это для вас, и у меня логически подключены два монитора через док-станцию). Но ноутбук закрыт, поэтому экран ноутбука не отображается.

Если я вхожу в свойства отображения, я вижу только один экран.

enter image description here

Подключено к CIMv2

select * from Win32_DesktopMonitor;

возвращает два экземпляра.

enter image description here

DesktopMonitor1 - это внешний дисплей (GenericPNPDisplay), а DesktopMonitor1 - монитор по умолчанию (экран).

Подключено к root\WMI

select * from WMIMonitorID;

дает мне только один экземпляр, и этот экземпляр является внешним монитором (я знаю это, потому что имя производителя - HP). (HWP26CE - это идентификатор для HP w2408, см. здесь)

enter image description here

Тогда есть разница между адаптерами дисплея и мониторами. EnumDisplayDevices показывает, какие адаптеры и EnumDisplayMonitors показывают вам мониторы. Первое состоит в том, чтобы просто перечислить адаптеры, но последний позволяет вам предоставить отсекающий прямоугольник и определить, какие мониторы, на которых обрезается прямоугольник, приземляются. Это становится полезным, когда у вас есть несколько активных мониторов, и кто-то решает сделать что-то, что вызывает ничью, которая будет охватывать несколько мониторов. Вы можете указать обратный вызов на EnumDisplayMonitors, и этот обратный вызов будет вызван с некоторыми параметрами (если память служит мне правильно, один из параметров был подмножеством указанного прямоугольника отсечения, который попадает на указанный монитор).

Я смутно помню SetupDiEnumDeviceInfo, и я думаю, что он дает вам HDEVINFO для каждого интерфейса, и поэтому он (я считаю) дает вам только одну запись в моей конфигурации, потому что у меня есть только один адаптер. Тогда вам нужно будет что-то сделать, чтобы получить SP_DEVINFO_DATA.

Я никогда не использовал DirectX и другой API, поэтому я закрою эти два. Надеюсь, кто-то еще сможет обсудить эти два вопроса, и вы получите полный ответ!

Ответ 2

В случае, если это имеет значение в вашем случае, при использовании Qt 5.x вы можете использовать метод QGuiApplication::screens() (http://qt-project.org/doc/qt-5.1/qtgui/qguiapplication.html#screens) для перечисления всех дисплеев.

Или, если это не актуально, вы всегда можете посмотреть их исходный код, как они перечисляют дисплеи и получают все соответствующие свойства (также в отношении зеркалирования, расширенных рабочих столов и т.д.).