コンピューターに接続されているモニターを列挙する 7 つの異なる方法を見つけました。ただし、すべてのソリューションで異なる結果が得られます (モニターの数と各モニターの情報)。
これらのソリューションは次のとおりです。
有名なものを使って
EnumDisplayDevices
Windows Management Instrumentation (WMI)の使用:
次のクエリを使用:SELECT * FROM WmiMonitorID
名前root\\WMI
空間で。再びWMIを使用:
新しいクエリ:名前空間SELECT * FROM Win32_DesktopMonitor
で。root\\CIMV2
Setup APIを使用する:
最初に呼び出しSetupDiGetClassDevs
てデバイス情報セットを取得し、次に次のように繰り返します。SetupDiEnumDeviceInfo
DirectX Graphics Infrastructure (DXGI)の使用
最初IDXGIFactory::EnumAdapters
に 、次にIDXGIAdapter::EnumOutput
ディスプレイの接続と構成 (CCD) APIの使用:
QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
MSDNリファレンスを使用して、これらすべてのメソッドの違いを正確に理解しようとしましたが、無駄でした。
観察
私が観察したことから:
- WmiMonitorIDおよびSetup APIクエリは、接続されている (必ずしもアクティブであるとは限らない) ディスプレイのリストを返します。
- Win32_DesktopMonitor WMIクエリは、間違った(少なくとも予期しない) 結果を返します (非アクティブな場合でも 1 つのモニターのみが列挙され、別のモニターでデスクトップが表示されます)。
- EnumDisplayDevicesは、アクティブなデバイスのリストを返します (1 つのモニターのみがアクティブで、他のモニターが接続されている場合を除く)。
- EnumDisplayMonitorsおよびDXGIクエリは、アクティブなモニターのリストを返します。
- CCDは最も信頼できる方法のようです (ターゲットとソースの間のすべての可能なパスを提供します)。
質問
これらの各方法 (接続されたディスプレイのリスト、インストールされたディスプレイのリスト、アクティブなディスプレイのリスト) を使用したときに実際に期待できる結果は何ですか? ミラー ディスプレイまたは拡張ディスプレイを使用している場合はどうなりますか? コンピュータに複数の出力のない複数のグラフィックス カードがある場合はどうなりますか?
おまけ: 一部のメソッド ( DXGI、EnumDisplayDevices、CCD ) は、 Adapter - Monitorで一種の階層を使用します。ただし、アダプターとモニターの間に同じリンクはありません。では、 DXGI用アダプターの定義は何ですか? CCD用? EnumDisplayDevices ? _