Wyliczanie monitorów na komputerze

Znalazłem 7 różnych sposobów wyliczenia monitorów podłączonych do komputera. Ale wszystkie rozwiązania dają różne wyniki (liczba monitorów i informacje na każdym monitorze).

Rozwiązania te to:

Używanie słynnegoEnumDisplayDevices

Za pomocąEnumDisplayMonitors

UżywającInstrumentacja zarządzania Windows (WMI):
Z następującym zapytaniem:SELECT * FROM WmiMonitorID wroot\\WMI przestrzeń nazw.

Ponownie używającWMI:
Z nowym zapytaniem:SELECT * FROM Win32_DesktopMonitor wroot\\CIMV2 przestrzeń nazw.

UżywającKonfiguracja API:
Przez pierwsze wezwanieSetupDiGetClassDevs aby pobrać zestaw informacji o urządzeniu, a następnie iterującSetupDiEnumDeviceInfo

UżywającInfrastruktura graficzna DirectX (DXGI)
Z pierwszymIDXGIFactory::EnumAdapters, następnieIDXGIAdapter::EnumOutput

UżywającInterfejsy API do łączenia i konfigurowania wyświetlaczy (CCD):
QueryDisplayConfig(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

Próbowałem dokładnie zrozumieć różnicę między wszystkimi tymi metodami z referencją MSDN na próżno.

Obserwacje

Z tego co zaobserwowałem:

TheWmiMonitorID iKonfiguracja API zapytania zwracają listę podłączonych (niekoniecznie aktywnych) ekranów.TheWin32_DesktopMonitor WMI zwraca zapytanieźle (co najmniej nieoczekiwany) wynik (tylko 1 monitor wyliczony, nawet gdy nieaktywny i pulpit na innym monitorze).EnumDisplayDevices zwraca listę aktywnych urządzeń (z wyjątkiem sytuacji, gdy aktywny jest tylko 1 monitor z innym podłączonym monitorem)EnumDisplayMonitors iDXGI zapytania zwracają listę aktywnych monitorów.CCD wydaje się być najbardziej wiarygodną metodą (podaje wszystkie możliwe ścieżki między celami a źródłami).pytania

Jakiego rezultatu powinienem się spodziewać, używając każdej z tych metod (lista podłączonych ekranów, lista zainstalowanych ekranów, lista aktywnych ekranów)? Co się stanie, jeśli użyję wyświetlaczy lustrzanych lub wyświetlaczy rozszerzonych? Co jeśli komputer ma wiele kart graficznych bez wielu wyjść?

Bonus: niektóre metody (DXGI, EnumDisplayDevices, CCD) użyj pewnego rodzaju hierarchii zAdapter-Monitor. Ale nie daje tych samych połączeń między Adaptery i Monitory. Jaka jest definicja adapteraDXGI? dlaCCD? dlaEnumDisplayDevices?

questionAnswers(2)

yourAnswerToTheQuestion