Aufzählung Bildschirme an einem computer

Habe ich 7 verschiedene Arten aufzählen, die Monitore an den computer angeschlossen. Aber alle Lösungen liefern unterschiedliche Ergebnisse (Anzahl der Monitore und Informationen auf jedem monitor).

Diese Lösungen sind:

  1. Mit dem berühmten EnumDisplayDevices

  2. Mit EnumDisplayMonitors

  3. Mithilfe der (Windows Management Instrumentation, WMI):

    Mit der folgenden Abfrage: SELECT * FROM WmiMonitorID im root\\WMI namespace.

  4. Wieder mit der WMI:

    Mit der neuen Abfrage: SELECT * FROM Win32_DesktopMonitor im root\\CIMV2 namespace.

  5. Mithilfe der Setup-API:

    Durch den ersten Aufruf SetupDiGetClassDevs zum abrufen der Informationen zum Gerät setzen Sie dann die Iteration mit SetupDiEnumDeviceInfo

  6. Mithilfe der DirectX Graphics Infrastruktur (DXGI)

    Mit ersten IDXGIFactory::EnumAdapters, dann IDXGIAdapter::EnumOutput

  7. Mithilfe der Anschließen und Konfigurieren der Displays (CCD) - APIs:

    QueryDisplayConfig(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

Habe ich versucht, genau zu verstehen, den Unterschied zwischen allen diesen Methoden mit der MSDN-Referenz, vergeblich.

Beobachtungen

Von dem, was ich beobachtet habe:

  • Die WmiMonitorID und Setup-API Abfragen return die Liste der angeschlossenen (nicht unbedingt aktiv) angezeigt.
  • Die Win32_DesktopMonitor WMI Abfrage falsch (zumindest unerwartete) Ergebnis (nur 1 monitor aufgelistet, auch wenn Sie inaktiv und desktop auf einem anderen monitor).
  • EnumDisplayDevices gibt die Liste der aktiven Geräte (außer wenn nur 1 monitor aktiv ist mit anderen monitor angeschlossen)
  • EnumDisplayMonitors und DXGI Abfragen zurückgeben der Liste der aktiven Monitore.
  • CCD scheint die zuverlässigste Methode (gibt alle möglichen Pfade zwischen Quellen und Zielen).

Fragen

Welchem Ergebnis soll ich wirklich erwarten, dass bei der Verwendung von alle diese Methoden (die Liste der angeschlossenen displays, Liste der installierten displays, in der Liste der aktiven displays)? Was wäre wenn ich mit Gespiegelten displays oder Extended displays? Was ist, wenn der computer mehrere Grafikkarten ohne mehrere Ausgänge?

Bonus: Einige Methoden (DXGI, EnumDisplayDevices, CCD) verwenden Sie eine Art von Hierarchie mit Adapter-Monitor. Aber macht nicht den gleichen links zwischen Adapter und Monitore. Also, was ist der définition von einem adapter für DXGI? für CCD? für EnumDisplayDevices?

  • Ich nehme an, der trick dabei wird sein, zu wissen, wenn Sie alle rufen die gleichen niedrigsten level-API und verwenden, die
  • Ich denke, das richtige zu tun, ist zu Fragen, eine präzisere Frage, wie "gewusst Wie: auflisten von X, wenn dabei Y ?", wobei X für monitor, physical device, logical device, etc. und Y ist Ihr Ziel. Mit Ihrem Ziel an hand sicherlich können Sie filter einige Möglichkeiten. Wie Ihr (tief und sehr präzise) die Forschung zeigt, sind die Dinge nicht so einfach, wie Sie dachte vorher, und es gibt keine mögliche Antwort, die die Verwendung von Worten wie "monitor" und "computer".
  • Bignon ich benutze nicht Windows, aber warum schreibst du nicht einige test-code, der benutzt, verwendet jeder dieser Methoden, die vielleicht in separate Dateien, und dann zerlegen Sie die Binärdateien, um zu sehen, wenn Sie machen die gleichen Systemaufrufe?
  • Ich schließe mich @tibo. Deine Frage ist zu offen. Hinzu kommt, dass es auch Unterschiede von einer version von Windows auf eine andere (einige DXGI nur für Windows 8, etc.). Eine Beobachtung, die nützlich sein können: die .NET framework (was als eine Abstraktionsschicht für Windows) definiert die Screen-Klasse (System.Windows.Formen.Bildschirm), die komplett auf EnumDisplayMonitors/GetMonitorInfo (das erzählt man den Namen des Geräts).
Schreibe einen Kommentar