QueryDisplayConfig 関数は、現在の設定のすべての表示デバイスまたはビューに対して使用可能なすべての表示パスに関する情報を取得します。
構文
LONG QueryDisplayConfig(
[in] UINT32 flags,
[in, out] UINT32 *numPathArrayElements,
[out] DISPLAYCONFIG_PATH_INFO *pathArray,
[in, out] UINT32 *numModeInfoArrayElements,
[out] DISPLAYCONFIG_MODE_INFO *modeInfoArray,
[out, optional] DISPLAYCONFIG_TOPOLOGY_ID *currentTopologyId
);
Parameters
[in] flags
取得する情報の種類。 flags パラメーターの値には、次のいずれかの値を使用する必要があります。
flags パラメーターは、次の値の 0 個以上のビットごとの OR で指定することもできます。
[in, out] numPathArrayElements
pathArray 内の要素の数を含む変数へのポインター。 このパラメーターは NULL できません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、numPathArrayElements は pathArray 内の有効なエントリの数で更新されます。
[out] pathArray
DISPLAYCONFIG_PATH_INFO要素の配列を含む変数へのポインター。 pathArray の各要素は、ソースからターゲットへの 1 つのパスを記述します。 ソース モードとターゲット モードの情報インデックスは、API に対して同時に返される modeInfoArray テーブルと組み合わせてのみ有効です。 このパラメーターは NULL できません。 pathArray は常にパスの優先順位で返されます。 パスの優先順位の詳細については、「パスの 優先順位」を参照してください。
[in, out] numModeInfoArrayElements
モード情報テーブルの要素数を指定する変数へのポインター。 このパラメーターは NULL できません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、numModeInfoArrayElements は modeInfoArray の有効なエントリの数で更新されます。
[out] modeInfoArray
DISPLAYCONFIG_MODE_INFO要素の配列を含む変数へのポインター。 このパラメーターは NULL できません。
[out, optional] currentTopologyId
CCD データベース内の現在アクティブなトポロジーの ID を受け取る変数へのポインター。 使用可能な値の一覧については、 DISPLAYCONFIG_TOPOLOGY_ID 列挙型を参照してください。
currentTopologyId パラメーターは、flags パラメーター値がQDC_DATABASE_CURRENTされている場合にのみ設定されます。
flags パラメーター値が QDC_DATABASE_CURRENT に設定されている場合、currentTopologyId パラメーターは NULL にすることはできません。 flags パラメーター値が QDC_DATABASE_CURRENT に設定されていない場合、currentTopologyId パラメーター値は NULL である必要があります。
戻り値
この関数は、次のいずれかのリターン コードを返します。
| リターン コード | Description |
|---|---|
|
関数が正常に実行されました。 |
|
指定されたパラメーターとフラグの組み合わせが無効です。 |
|
システムは、Windows ディスプレイ ドライバー モデル (WDDM) に従って記述されたグラフィックス ドライバーを実行していません。 この関数は、WDDM ドライバーが実行されているシステムでのみサポートされます。 |
|
呼び出し元はコンソール セッションにアクセスできません。 このエラーは、呼び出し元のプロセスが現在のデスクトップにアクセスできない場合、またはリモート セッションで実行されている場合に発生します。 |
|
指定されていないエラーが発生しました。 |
|
指定されたパスとモード バッファーが小さすぎます。 |
注釈
GetDisplayConfigBufferSizes 関数は特定の時点でのみ必要な配列サイズを決定できるため、GetDisplayConfigBufferSizes と QueryDisplayConfig の呼び出しの間にシステム構成が変更され、指定された配列サイズで新しいパス データを格納するのに十分ではなくなる可能性があります。 このような場合、 QueryDisplayConfig はERROR_INSUFFICIENT_BUFFERで失敗し、呼び出し元は GetDisplayConfigBufferSizes をもう一度呼び出して新しい配列サイズを取得する必要があります。 呼び出し元は、正しいメモリ量を割り当てる必要があります。
QueryDisplayConfig は、 pathArray パラメーターが指定するパス配列内のパスと、 modeInfoArray パラメーターが指定するモード配列内のソース モードとターゲット モードを返します。 QueryDisplayConfig は常にパスの優先順位でパスを返します。 flags パラメーターにQDC_ALL_PATHSが設定されている場合、QueryDisplayConfig はアクティブなパスの後にあるすべての非アクティブなパスを返します。
完全パス、ソース モード、およびターゲット モードの情報は、すべてのアクティブ パスで使用できます。 ソースとターゲットのDISPLAYCONFIG_PATH_SOURCE_INFOおよびDISPLAYCONFIG_PATH_TARGET_INFO構造体の ModeInfoIdx メンバーは、これらのアクティブ パスに対して設定されます。 非アクティブなパスの場合、返されたソース モードとターゲット モードの情報は使用できません。そのため、パス構造内のターゲット情報は既定値に設定され、ソース モードとターゲット モードのインデックスは無効としてマークされます。 データベース クエリの場合、現在の接続モニターにエントリがある場合、 QueryDisplayConfig は完全なパス、ソース モード、およびターゲット モードの情報を返します (アクティブ パスの場合と同じです)。 ただし、データベースにエントリがない場合、 QueryDisplayConfig は既定のターゲットの詳細を含むパス情報のみを返します (非アクティブなパスの場合と同じです)。
ソース モードとターゲット モードの情報とパス情報の関係の例については、「 モード情報とパス情報の関係」を参照してください。
呼び出し元は DisplayConfigGetDeviceInfo を使用して、ソースまたはターゲット デバイスに関する追加情報 (モニター名、優先モードとソース デバイス名の監視など) を取得できます。
ターゲットが現在強制的に投影されている場合、DISPLAYCONFIG_PATH_TARGET_INFO構造体の statusFlags メンバーには、DISPLAYCONFIG_TARGET_FORCED_XXX フラグのいずれかが設定されています。
QDC_DATABASE_CURRENT フラグが Flags パラメーターに設定されている場合、 QueryDisplayConfig は currentTopologyId パラメーターが指す変数内のアクティブなデータベース トポロジのトポロジ識別子を返します。 QDC_ALL_PATHSまたはQDC_ONLY_ACTIVE_PATHSフラグが Flags パラメーターに設定されている場合は、 currentTopologyId パラメーターを NULL に設定する必要があります。それ以外の場合、 QueryDisplayConfig はERROR_INVALID_PARAMETERを返します。
呼び出し元が flags パラメーターに設定されたQDC_DATABASE_CURRENT フラグを使用して QueryDisplayConfig を呼び出した場合、QueryDisplayConfig は、DISPLAYCONFIG_VIDEO_SIGNAL_INFO構造体の totalSize メンバーで指定されたDISPLAYCONFIG_2DREGION構造体を 0 に初期化し、DISPLAYCONFIG_2DREGIONを完了しません。
EnumDisplaySettings Win32 関数によって返される DEVMODE 構造体 (Windows SDK ドキュメントで説明) には、ソース モードとターゲット モードの両方に関連する情報が含まれています。 ただし、 CCD API は 、ソース・モード・コンポーネントとターゲット・モード・コンポーネントを明示的に分離します。
ヘッドマウントおよび特殊なモニター
QueryDisplayConfig およびその他の多くの Win32 ディスプレイ API では、Windowsデスクトップ環境には参加しないため、ヘッドマウントされた特殊なモニターに対する認識が制限されています。 ただし、これらのディスプレイの接続性 (コンテンツ保護シナリオなど) を理解する必要があるシナリオがあります。 このような限られたシナリオでは、 (QDC_INCLUDE_HMD | QDC_ONLY_ACTIVE_PATHS) を使用して、ヘッドマウントディスプレイの接続性を検出できます。 これらのパスは、 DISPLAYCONFIG_PATH_TARGET_INFO.statusFlags フィールドのDISPLAYCONFIG_TARGET_IS_HMD フラグでマークされます。 このサポートは、Windows 10 1703 Creators Update で追加されました。
DPI 仮想化
この API は DPI 仮想化には参加しません。 DEVMODE 構造体のすべてのサイズは、物理ピクセルの観点から見て、呼び出し元のコンテキストに関連していません。
Examples
次の例では、QueryDisplayConfig と GetDisplayConfigBufferSizes を使用してアクティブな表示パスを列挙し、DisplayConfigGetDeviceInfo を使用して各パスのデータを出力します。
#include <windows.h>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main()
{
vector<DISPLAYCONFIG_PATH_INFO> paths;
vector<DISPLAYCONFIG_MODE_INFO> modes;
UINT32 flags = QDC_ONLY_ACTIVE_PATHS | QDC_VIRTUAL_MODE_AWARE;
LONG result = ERROR_SUCCESS;
do
{
// Determine how many path and mode structures to allocate
UINT32 pathCount, modeCount;
result = GetDisplayConfigBufferSizes(flags, &pathCount, &modeCount);
if (result != ERROR_SUCCESS)
{
return HRESULT_FROM_WIN32(result);
}
// Allocate the path and mode arrays
paths.resize(pathCount);
modes.resize(modeCount);
// Get all active paths and their modes
result = QueryDisplayConfig(flags, &pathCount, paths.data(), &modeCount, modes.data(), nullptr);
// The function may have returned fewer paths/modes than estimated
paths.resize(pathCount);
modes.resize(modeCount);
// It's possible that between the call to GetDisplayConfigBufferSizes and QueryDisplayConfig
// that the display state changed, so loop on the case of ERROR_INSUFFICIENT_BUFFER.
} while (result == ERROR_INSUFFICIENT_BUFFER);
if (result != ERROR_SUCCESS)
{
return HRESULT_FROM_WIN32(result);
}
// For each active path
for (auto& path : paths)
{
// Find the target (monitor) friendly name
DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = {};
targetName.header.adapterId = path.targetInfo.adapterId;
targetName.header.id = path.targetInfo.id;
targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
targetName.header.size = sizeof(targetName);
result = DisplayConfigGetDeviceInfo(&targetName.header);
if (result != ERROR_SUCCESS)
{
return HRESULT_FROM_WIN32(result);
}
// Find the adapter device name
DISPLAYCONFIG_ADAPTER_NAME adapterName = {};
adapterName.header.adapterId = path.targetInfo.adapterId;
adapterName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME;
adapterName.header.size = sizeof(adapterName);
result = DisplayConfigGetDeviceInfo(&adapterName.header);
if (result != ERROR_SUCCESS)
{
return HRESULT_FROM_WIN32(result);
}
wcout
<< L"Monitor with name "
<< (targetName.flags.friendlyNameFromEdid ? targetName.monitorFriendlyDeviceName : L"Unknown")
<< L" is connected to adapter "
<< adapterName.adapterDevicePath
<< L" on target "
<< path.targetInfo.id
<< L"\n";
}
}
Requirements
| Requirement | 価値 |
|---|---|
| サポートされる最小クライアント | Windows オペレーティング システムのWindows 7以降のバージョンで使用できます。 |
| ターゲット プラットフォーム の | 普遍 |
| ヘッダー | winuser.h (Windows.h を含む) |
| ライブラリ | User32.lib;Windows 10の OneCoreUAP.lib |
| DLL | User32.dll |
| API セットの | ext-ms-win-ntuser-sysparams-ext-l1-1-1 (Windows 10 バージョン 10.0.14393 で導入) |
こちらも参照ください
DISPLAYCONFIG_PATH_SOURCE_INFO