Ответ 1
Я не знаю всех этих API, но я помню некоторые из них (плохие воспоминания), так что вот что я могу запомнить и найти из-за того, что выкалывание в MSDN и игра с wbemtest, которого я удивляюсь, я даже помню. Я понимаю, что этот ответ, вероятно, не ВСЕ, на что вы надеялись.
Для иллюстраций ниже (и все эти иллюстрации приведены на моем ноутбуке Dell Latitude, я набираю это для вас, и у меня логически подключены два монитора через док-станцию). Но ноутбук закрыт, поэтому экран ноутбука не отображается.
Если я вхожу в свойства отображения, я вижу только один экран.
Подключено к CIMv2
select * from Win32_DesktopMonitor;
возвращает два экземпляра.
DesktopMonitor1 - это внешний дисплей (GenericPNPDisplay), а DesktopMonitor1 - монитор по умолчанию (экран).
Подключено к root\WMI
select * from WMIMonitorID;
дает мне только один экземпляр, и этот экземпляр является внешним монитором (я знаю это, потому что имя производителя - HP). (HWP26CE - это идентификатор для HP w2408, см. здесь)
Тогда есть разница между адаптерами дисплея и мониторами. EnumDisplayDevices
показывает, какие адаптеры и EnumDisplayMonitors
показывают вам мониторы. Первое состоит в том, чтобы просто перечислить адаптеры, но последний позволяет вам предоставить отсекающий прямоугольник и определить, какие мониторы, на которых обрезается прямоугольник, приземляются. Это становится полезным, когда у вас есть несколько активных мониторов, и кто-то решает сделать что-то, что вызывает ничью, которая будет охватывать несколько мониторов. Вы можете указать обратный вызов на EnumDisplayMonitors
, и этот обратный вызов будет вызван с некоторыми параметрами (если память служит мне правильно, один из параметров был подмножеством указанного прямоугольника отсечения, который попадает на указанный монитор).
Я смутно помню SetupDiEnumDeviceInfo
, и я думаю, что он дает вам HDEVINFO
для каждого интерфейса, и поэтому он (я считаю) дает вам только одну запись в моей конфигурации, потому что у меня есть только один адаптер. Тогда вам нужно будет что-то сделать, чтобы получить SP_DEVINFO_DATA
.
Я никогда не использовал DirectX и другой API, поэтому я закрою эти два. Надеюсь, кто-то еще сможет обсудить эти два вопроса, и вы получите полный ответ!