コンピューターに接続されているモニターを列挙する7つの方法を見つけました。ただし、すべてのソリューションでは結果が異なります(モニターの数と各モニターの情報)。
これらのソリューションは次のとおりです。
有名な EnumDisplayDevices
を使用する
EnumDisplayMonitors
を使用する
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リファレンスを使用して正確に理解しようとしましたが、無駄です。
私が観察したものから:
これらの各方法(接続されたディスプレイのリスト、インストールされたディスプレイのリスト、アクティブなディスプレイのリスト)を使用すると、どのような結果が期待できますか?ミラーディスプレイまたは拡張ディスプレイを使用するとどうなりますか?コンピューターに複数の出力のない複数のグラフィックスカードがある場合はどうなりますか?
ボーナス:一部のメソッド([〜#〜] dxgi [〜#〜]、EnumDisplayDevices、[〜#〜] ccd [〜#〜])で一種の階層を使用するアダプター-モニター。ただし、アダプターとモニターの間に同じリンクはありません。 [〜#〜] dxgi [〜#〜]のアダプタの定義は何ですか? [〜#〜] ccd [〜#〜]? EnumDisplayDevices?
これらのAPIのすべてを知っているわけではありませんが、それらの一部(悪い思い出)を覚えています。MSDNをざっと見て、wbemtestで遊んだときに覚えておくことができる情報を以下に示します。私はこの答えがあなたが望んでいた[〜#〜] all [〜#〜]ではないことを認識しています。
以下の図について(これらの図はすべて、Dell Latitudeラップトップにあります。これを入力しているときに、論理的に2つのモニターがドッキングステーションを介して接続されています)。ただし、ラップトップは閉じているため、ラップトップ画面は表示されません。
表示プロパティに移動すると、画面が1つしか表示されません。
CIMv2に接続
select * from Win32_DesktopMonitor;
2つのインスタンスを返します。
DesktopMonitor1は外部ディスプレイ(GenericPNPDisplay)で、DesktopMonitor1はデフォルトのモニター(画面)です。
Root\WMIに接続されています
select * from WMIMonitorID;
私に1つのインスタンスのみを与え、そのインスタンスは外部モニターです(メーカー名がHPであるため、これを知っています)。 (HWP26CEはHP w2408の識別子です。 ここ を参照)
次に、ディスプレイアダプターとモニターの違いがあります。 EnumDisplayDevices
はアダプターを示し、EnumDisplayMonitors
はモニターを示します。前者は主にアダプターを列挙するだけですが、後者ではクリッピング四角形を提供し、そのクリッピング四角形がたまたま表示されるモニターを決定できます。これは、複数のアクティブなモニターがあり、誰かが複数のモニターにまたがる描画を引き起こす何かを行うことを決定した場合に役立ちます。 EnumDisplayMonitors
へのコールバックを指定すると、そのコールバックはいくつかのパラメーターで呼び出されます(メモリが正しく機能する場合、パラメーターの1つは、指定されたモニターに表示される指定されたクリッピング四角形のサブセットでした)。
私は漠然とSetupDiEnumDeviceInfo
を覚えており、それによって各インターフェースのHDEVINFO
が得られると思います。したがって、アダプタが1つしかないため、私の構成には1つのエントリしか与えられません(私はそう思います)。次に、SP_DEVINFO_DATA
を取得するために何かをする必要があります。
私はDirectXと他のAPIを使用したことがないので、これら2つについては説明しません。うまくいけば、他の誰かがそれらの2つについてパイプアップでき、完全な答えが得られる可能性があります!
それがあなたのケースに関連している場合、Qt 5.xを使用するとき、QGuiApplication::screens()
メソッドを使用できます( http://qt-project.org/doc/qt-5.1/qtgui /qguiapplication.html#screens )すべてのディスプレイを列挙します。
または、関連性がない場合は、いつでもソースコードを調べて、ディスプレイを列挙し、すべての関連プロパティ(ミラーリング、拡張デスクトップなど)を取得する方法を調べることができます。