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
);

Parameters

[in] flags

取得する情報の種類。 flags パラメーターの値には、次のいずれかの値を使用する必要があります。

価値 説明
QDC_ALL_PATHS
0x00000001
ソースからターゲットへの可能なすべてのパスの組み合わせを返します。

Note

一時的なモードの場合、QDC_ALL_PATHS設定は、返されるモード データが永続化データベースに格納されているモード データと同じではないことを意味します。

Note

このフラグは、計算に非常にコストがかかる場合があります。 呼び出し元がソースとターゲットの間の有効な接続のセットを決定しようとしている場合を除き、このフラグを使用することはお勧めしません。

QDC_ONLY_ACTIVE_PATHS
0x00000002
現在アクティブなパスのみを返します。

Note

一時モードの場合、QDC_ONLY_ACTIVE_PATHS設定は、返されるモード データが永続化データベースに格納されているモード データと同じではないことを意味します。

QDC_DATABASE_CURRENT
0x00000004
現在接続されているディスプレイの CCD データベースで定義されているアクティブ・パスを戻します。

flags パラメーターは、次の値の 0 個以上のビットごとの OR で指定することもできます。

価値 説明
QDC_VIRTUAL_MODE_AWARE
0x00000010
このフラグは、呼び出し元が仮想モードのサポートを認識していることを示すために、他のフラグと共にビットごとの OR を付ける必要があります。

Windows 10 以降でサポートされています。

QDC_INCLUDE_HMD
0x00000020
このフラグは、呼び出し元がアクティブなパスの一覧にヘッド マウントディスプレイ (HMD) を含める必要があることを示すために、QDC_ONLY_ACTIVE_PATHSでビットごとの OR を付ける必要があります。 詳細については「備考」を参照してください。

Windows 10 1703 Creators Update 以降でサポートされています。

QDC_VIRTUAL_REFRESH_RATE_AWARE
0x00000040
このフラグは、呼び出し元が仮想リフレッシュ レートのサポートを認識していることを示すために、他のフラグと共にビットごとの OR を付ける必要があります。

Windows 11 以降でサポートされています。

[in, out] numPathArrayElements

pathArray 内の要素の数を含む変数へのポインター。 このパラメーターは NULL できません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、numPathArrayElementspathArray 内の有効なエントリの数で更新されます。

[out] pathArray

DISPLAYCONFIG_PATH_INFO要素の配列を含む変数へのポインター。 pathArray の各要素は、ソースからターゲットへの 1 つのパスを記述します。 ソース モードとターゲット モードの情報インデックスは、API に対して同時に返される modeInfoArray テーブルと組み合わせてのみ有効です。 このパラメーターは NULL できません。 pathArray は常にパスの優先順位で返されます。 パスの優先順位の詳細については、「パスの 優先順位」を参照してください。

[in, out] numModeInfoArrayElements

モード情報テーブルの要素数を指定する変数へのポインター。 このパラメーターは NULL できません。 QueryDisplayConfig がERROR_SUCCESSを返す場合、numModeInfoArrayElementsmodeInfoArray の有効なエントリの数で更新されます。

[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
ERROR_SUCCESS
関数が正常に実行されました。
ERROR_INVALID_PARAMETER
指定されたパラメーターとフラグの組み合わせが無効です。
ERROR_NOT_SUPPORTED
システムは、Windows ディスプレイ ドライバー モデル (WDDM) に従って記述されたグラフィックス ドライバーを実行していません。 この関数は、WDDM ドライバーが実行されているシステムでのみサポートされます。
ERROR_ACCESS_DENIED
呼び出し元はコンソール セッションにアクセスできません。 このエラーは、呼び出し元のプロセスが現在のデスクトップにアクセスできない場合、またはリモート セッションで実行されている場合に発生します。
ERROR_GEN_FAILURE
指定されていないエラーが発生しました。
ERROR_INSUFFICIENT_BUFFER
指定されたパスとモード バッファーが小さすぎます。

注釈

GetDisplayConfigBufferSizes 関数は特定の時点でのみ必要な配列サイズを決定できるため、GetDisplayConfigBufferSizesQueryDisplayConfig の呼び出しの間にシステム構成が変更され、指定された配列サイズで新しいパス データを格納するのに十分ではなくなる可能性があります。 このような場合、 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 パラメーターに設定されている場合、 QueryDisplayConfigcurrentTopologyId パラメーターが指す変数内のアクティブなデータベース トポロジのトポロジ識別子を返します。 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_MODE_INFO

DISPLAYCONFIG_PATH_INFO

DISPLAYCONFIG_PATH_SOURCE_INFO

DISPLAYCONFIG_PATH_TARGET_INFO

DISPLAYCONFIG_TOPOLOGY_ID

DisplayConfigGetDeviceInfo

SetDisplayConfig