48

コンピューターに接続されているモニターを列挙する 7 つの異なる方法を見つけました。ただし、すべてのソリューションで異なる結果が得られます (モニターの数と各モニターの情報)。

これらのソリューションは次のとおりです。

  1. 有名なものを使ってEnumDisplayDevices

  2. 使用するEnumDisplayMonitors

  3. Windows Management Instrumentation (WMI)の使用:
    次のクエリを使用:SELECT * FROM WmiMonitorID名前root\\WMI空間で。

  4. 再びWMIを使用:
    新しいクエリ:名前空間SELECT * FROM Win32_DesktopMonitorで。root\\CIMV2

  5. Setup APIを使用する:
    最初に呼び出しSetupDiGetClassDevsてデバイス情報セットを取得し、次に次のように繰り返します。SetupDiEnumDeviceInfo

  6. DirectX Graphics Infrastructure (DXGI)の使用
    最初IDXGIFactory::EnumAdaptersに 、次にIDXGIAdapter::EnumOutput

  7. ディスプレイの接続と構成 (CCD) APIの使用:
    QueryDisplayConfig(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

MSDNリファレンスを使用して、これらすべてのメソッドの違いを正確に理解しようとしましたが、無駄でした。

観察

私が観察したことから:

  • WmiMonitorIDおよびSetup APIクエリは、接続されている (必ずしもアクティブであるとは限らない) ディスプレイのリストを返します
  • Win32_DesktopMonitor WMIクエリは、間違った(少なくとも予期しない) 結果を返します (非アクティブな場合でも 1 つのモニターのみが列挙され、別のモニターでデスクトップが表示されます)。
  • EnumDisplayDevicesは、アクティブなデバイスのリストを返します (1 つのモニターのみがアクティブで、他のモニターが接続されている場合を除く)。
  • EnumDisplayMonitorsおよびDXGIクエリは、アクティブなモニターのリストを返します。
  • CCDは最も信頼できる方法のようです (ターゲットとソースの間のすべての可能なパスを提供します)。

質問

これらの各方法 (接続されたディスプレイのリスト、インストールされたディスプレイのリスト、アクティブなディスプレイのリスト) を使用したときに実際に期待できる結果は何ですか? ミラー ディスプレイまたは拡張ディスプレイを使用している場合はどうなりますか? コンピュータに複数の出力のない複数のグラフィックス カードがある場合はどうなりますか?

おまけ: 一部のメソッド ( DXGIEnumDisplayDevicesCCD ) は、 Adapter - Monitorで一種の階層を使用します。ただし、アダプターとモニターの間に同じリンクはありません。では、 DXGI用アダプターの定義は何ですか? CCD用? EnumDisplayDevices ? _

4

2 に答える 2

1

あなたの場合に関連する場合、Qt 5.x を使用する場合、QGuiApplication::screens()メソッド ( http://qt-project.org/doc/qt-5.1/qtgui/qguiapplication.html#screens ) を使用してすべてのディスプレイを列挙できます。 .

または、関係がない場合は、いつでもソースコードを調べて、ディスプレイを列挙し、関連するすべてのプロパティを取得する方法を確認できます (ミラーリング、拡張デスクトップなどに関しても)。

于 2013-08-14T13:35:57.630 に答える