QueryDisplayConfig 関数 (winuser.h)
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
);
パラメーター
[in] flags
取得する情報の種類。 Flags パラメーターの値は、次のいずれかの値を使用する必要があります。
Flags パラメーターは、次の値の 0 個以上のビットごとの OR で指定することもできます。
[in, out] numPathArrayElements
pPathInfoArray 内の要素の数を含む変数へのポインター。 このパラメーターを NULL にすることはできません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、pNumPathInfoElements は pPathInfoArray 内の有効なエントリの数で更新されます。
[out] pathArray
DISPLAYCONFIG_PATH_INFO要素の配列を含む変数へのポインター。 pPathInfoArray の各要素は、ソースからターゲットへの 1 つのパスを記述します。 ソース モードとターゲット モードの情報インデックスは、API に対して同時に返される pmodeInfoArray テーブルと組み合わせてのみ有効です。 このパラメーターを NULL にすることはできません。 pPathInfoArray は常にパスの優先順位で返されます。 パスの優先順位の詳細については、「パスの 優先順位」を参照してください。
[in, out] numModeInfoArrayElements
モード情報テーブルの 要素内の数値を指定する変数へのポインター。 このパラメーターを NULL にすることはできません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、pNumModeInfoArrayElements は pModeInfoArray 内の有効なエントリの数で更新されます。
[out] modeInfoArray
DISPLAYCONFIG_MODE_INFO要素の配列を含む変数へのポインター。 このパラメーターを NULL にすることはできません。
[out, optional] currentTopologyId
CCD データベース内の現在アクティブなトポロジーの ID を受け取る変数へのポインター。 使用可能な値の一覧については、 列挙型DISPLAYCONFIG_TOPOLOGY_ID を参照してください。
pCurrentTopologyId パラメーターは、Flags パラメーター値がQDC_DATABASE_CURRENTされている場合にのみ設定されます。
Flags パラメーターの値が QDC_DATABASE_CURRENT に設定されている場合、pCurrentTopologyId パラメーターは NULL にすることはできません。 Flags パラメーターの値が QDC_DATABASE_CURRENT に設定されていない場合、pCurrentTopologyId パラメーターの値は NULL である必要があります。
戻り値
関数は、次のいずれかのリターン コードを返します。
リターン コード | 説明 |
---|---|
|
関数が正常に実行されました。 |
|
指定されたパラメーターとフラグの組み合わせが無効です。 |
|
システムでは、 Windows ディスプレイ ドライバー モデル (WDDM) に従って記述されたグラフィックス ドライバーが実行されていません。 関数は、WDDM ドライバーが実行されているシステムでのみサポートされます。 |
|
呼び出し元はコンソール セッションにアクセスできません。 このエラーは、呼び出し元のプロセスが現在のデスクトップにアクセスできない場合、またはリモート セッションで実行されている場合に発生します。 |
|
未指定のエラーが発生しました。 |
|
指定されたパスとモード バッファーが小さすぎます。 |
解説
GetDisplayConfigBufferSizes 関数は特定の時点でのみ必要な配列サイズを決定できるため、GetDisplayConfigBufferSizes と QueryDisplayConfig の呼び出しの間にシステム構成が変更され、指定された配列サイズで新しいパス データを格納するのに十分ではなくなる可能性があります。 この場合、 QueryDisplayConfig はERROR_INSUFFICIENT_BUFFERで失敗し、呼び出し元は GetDisplayConfigBufferSizes をもう一度呼び出して新しい配列サイズを取得する必要があります。 その後、呼び出し元は正しい量のメモリを割り当てる必要があります。
QueryDisplayConfig は、 pPathInfoArray パラメーターが指定するパス配列内のパスと、 pModeInfoArray パラメーターが指定するモード配列内のソース モードとターゲット モードを返します。 QueryDisplayConfig は 常にパスの優先順位でパスを返します。 QDC_ALL_PATHSが Flags パラメーターに設定されている場合、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 は pCurrentTopologyId パラメーターが指す変数内のアクティブなデータベース トポロジのトポロジ識別子を返します。 QDC_ALL_PATHSまたはQDC_ONLY_ACTIVE_PATHS フラグが Flags パラメーターに設定されている場合は、 pCurrentTopologyId パラメーターを 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 構造体のすべてのサイズは物理ピクセルの観点からであり、呼び出し元のコンテキストには関連しません。
例
次の例では、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";
}
}
要件
サポートされている最小のクライアント | Windows 7 以降のバージョンの Windows オペレーティング システムで使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | winuser.h (Windows.h を含む) |
Library | 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