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 パラメーターの値は、次のいずれかの値を使用する必要があります。

説明
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

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

[out] pathArray

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

[in, out] numModeInfoArrayElements

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

[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 である必要があります。

戻り値

関数は、次のいずれかのリターン コードを返します。

リターン コード 説明
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 は、 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 パラメーターに設定されている場合、 QueryDisplayConfigpCurrentTopologyId パラメーターが指す変数内のアクティブなデータベース トポロジのトポロジ識別子を返します。 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_MODE_INFO

DISPLAYCONFIG_PATH_INFO

DISPLAYCONFIG_PATH_SOURCE_INFO

DISPLAYCONFIG_PATH_TARGET_INFO

DISPLAYCONFIG_TOPOLOGY_ID

DisplayConfigGetDeviceInfo

SetDisplayConfig