Auflisten von Monitoren auf einem Computer
Ich habe 7 verschiedene Möglichkeiten gefunden, um die an den Computer angeschlossenen Monitore aufzulisten. Alle Lösungen liefern jedoch unterschiedliche Ergebnisse (Anzahl der Monitore und Informationen auf jedem Monitor).
Diese Lösungen sind:
Mit dem berühmtenEnumDisplayDevices
VerwendenEnumDisplayMonitors
Verwendung derWindows-Verwaltungsinstrumentation (WMI):
Mit der folgenden Abfrage:SELECT * FROM WmiMonitorID
in demroot\\WMI
Namespace.
Wieder mit demWMI:
Mit der neuen Abfrage:SELECT * FROM Win32_DesktopMonitor
in demroot\\CIMV2
Namespace.
Verwendung derSetup-API:
Beim ersten AnrufSetupDiGetClassDevs
Um die eingestellten Geräteinformationen abzurufen, iterieren Sie mitSetupDiEnumDeviceInfo
Verwendung derDirectX-Grafikinfrastruktur (DXGI)
Mit zuerstIDXGIFactory::EnumAdapters
, dannIDXGIAdapter::EnumOutput
Verwendung derAnschließen und Konfigurieren von CCD-APIs (Displays):QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
Ich habe versucht, den Unterschied zwischen all diesen Methoden mit der MSDN-Referenz genau zu verstehen, vergebens.
BeobachtungenNach allem, was ich beobachtet habe:
DasWmiMonitorID undSetup-API Abfragen geben die Liste der verbundenen (nicht unbedingt aktiven) Anzeigen zurück.DasWin32_DesktopMonitor WMI Abfrage kehrt zurückfalsch (zumindest unerwartetes) Ergebnis (nur 1 Monitor wird aufgelistet, auch wenn er inaktiv ist, und Desktop auf einem anderen Monitor).EnumDisplayDevices gibt die Liste der aktiven Geräte zurück (außer wenn nur 1 Monitor aktiv ist und ein anderer Monitor angeschlossen ist)EnumDisplayMonitors undDXGI Abfragen geben die Liste der aktiven Monitore zurück.CCD scheint die zuverlässigste Methode zu sein (gibt alle möglichen Pfade zwischen Zielen und Quellen an).FragenWelches Ergebnis kann ich wirklich erwarten, wenn ich jede dieser Methoden verwende (Liste der verbundenen Anzeigen, Liste der installierten Anzeigen, Liste der aktiven Anzeigen)? Was ist, wenn ich gespiegelte oder erweiterte Displays verwende? Was ist, wenn der Computer über mehrere Grafikkarten ohne mehrere Ausgänge verfügt?
Bonus: Einige Methoden (DXGI, EnumDisplayDevices, CCD) benutze eine Art Hierarchie mitAdapter-Monitor. Gibt aber nicht die gleichen Links zwischen Adaptern und Monitoren. Also, was ist die Definition eines Adapters fürDXGI? zumCCD? zumEnumDisplayDevices?