web-dev-qa-db-ja.com

コンピューター上のモニターを列挙する

コンピューターに接続されているモニターを列挙する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クエリは、wrong(少なくとも予期しない)結果(のみ非アクティブで別のモニター上のデスクトップであっても、1つのモニターが列挙されます)。
  • EnumDisplayDevicesは、アクティブなデバイスのリストを返します(1台のモニターのみがアクティブで、他のモニターが接続されている場合を除く)
  • EnumDisplayMonitorsおよび[〜#〜] dxgi [〜#〜]クエリアクティブなモニターのリストを返します。
  • [〜#〜] ccd [〜#〜]は、最も信頼できる方法のようです(ターゲットとソース間のすべての可能なパスを提供します)。

ご質問

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

ボーナス:一部のメソッド([〜#〜] dxgi [〜#〜]EnumDisplayDevices[〜#〜] ccd [〜#〜]で一種の階層を使用するアダプター-モニター。ただし、アダプターとモニターの間に同じリンクはありません。 [〜#〜] dxgi [〜#〜]のアダプタの定義は何ですか? [〜#〜] ccd [〜#〜]EnumDisplayDevices

42
Cédric Bignon

これらのAPIのすべてを知っているわけではありませんが、それらの一部(悪い思い出)を覚えています。MSDNをざっと見て、wbemtestで遊んだときに覚えておくことができる情報を以下に示します。私はこの答えがあなたが望んでいた[〜#〜] all [〜#〜]ではないことを認識しています。

以下の図について(これらの図はすべて、Dell Latitudeラップトップにあります。これを入力しているときに、論理的に2つのモニターがドッキングステーションを介して接続されています)。ただし、ラップトップは閉じているため、ラップトップ画面は表示されません。

表示プロパティに移動すると、画面が1つしか表示されません。

enter image description here

CIMv2に接続

select * from Win32_DesktopMonitor;

2つのインスタンスを返します。

enter image description here

DesktopMonitor1は外部ディスプレイ(GenericPNPDisplay)で、DesktopMonitor1はデフォルトのモニター(画面)です。

Root\WMIに接続されています

select * from WMIMonitorID;

私に1つのインスタンスのみを与え、そのインスタンスは外部モニターです(メーカー名がHPであるため、これを知っています)。 (HWP26CEはHP w2408の識別子です。 ここ を参照)

enter image description here

次に、ディスプレイアダプターとモニターの違いがあります。 EnumDisplayDevicesはアダプターを示し、EnumDisplayMonitorsはモニターを示します。前者は主にアダプターを列挙するだけですが、後者ではクリッピング四角形を提供し、そのクリッピング四角形がたまたま表示されるモニターを決定できます。これは、複数のアクティブなモニターがあり、誰かが複数のモニターにまたがる描画を引き起こす何かを行うことを決定した場合に役立ちます。 EnumDisplayMonitorsへのコールバックを指定すると、そのコールバックはいくつかのパラメーターで呼び出されます(メモリが正しく機能する場合、パラメーターの1つは、指定されたモニターに表示される指定されたクリッピング四角形のサブセットでした)。

私は漠然とSetupDiEnumDeviceInfoを覚えており、それによって各インターフェースのHDEVINFOが得られると思います。したがって、アダプタが1つしかないため、私の構成には1つのエントリしか与えられません(私はそう思います)。次に、SP_DEVINFO_DATAを取得するために何かをする必要があります。

私はDirectXと他のAPIを使用したことがないので、これら2つについては説明しません。うまくいけば、他の誰かがそれらの2つについてパイプアップでき、完全な答えが得られる可能性があります!

10
amrith

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

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

1
Kurt Pattyn