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
대상에 대한 원본의 가능한 모든 경로 조합을 반환합니다.

참고

임시 모드의 경우 QDC_ALL_PATHS 설정은 반환된 모드 데이터가 지속성 데이터베이스에 저장된 모드 데이터와 동일하지 않을 수 있음을 의미합니다.

참고

이 플래그는 컴퓨팅 비용이 매우 많이 들 수 있습니다. 호출자가 원본과 대상 간의 유효한 연결 집합을 확인하려고 하지 않는 한 이 플래그를 사용하지 않는 것이 좋습니다.

QDC_ONLY_ACTIVE_PATHS
0x00000002
현재 활성 경로만 반환합니다.

참고

임시 모드의 경우 QDC_ONLY_ACTIVE_PATHS 설정은 반환된 모드 데이터가 지속성 데이터베이스에 저장된 모드 데이터와 동일하지 않을 수 있음을 의미합니다.

QDC_DATABASE_CURRENT
0x00000004
현재 연결된 디스플레이에 대해 CCD 데이터베이스에 정의된 활성 경로를 반환합니다.

Flags 매개 변수는 다음 값 중 0개 이상인 비트 OR'ed일 수도 있습니다.

의미
QDC_VIRTUAL_MODE_AWARE
0x00000010
이 플래그는 호출자가 가상 모드 지원을 알고 있음을 나타내기 위해 다른 플래그와 함께 비트 OR이어야 합니다.

Windows 10 부터 지원합니다.

QDC_INCLUDE_HMD
0x00000020
이 플래그는 호출자가 활성 경로 목록에 헤드 탑재 디스플레이(HMD)를 포함하려 함을 나타내기 위해 QDC_ONLY_ACTIVE_PATHS 비트 OR이어야 합니다. 자세한 내용은 설명 부분을 참조하십시오.

Windows 10 1703 크리에이터스 업데이트부터 지원됩니다.

QDC_VIRTUAL_REFRESH_RATE_AWARE
0x00000040
이 플래그는 호출자가 가상 새로 고침 속도 지원을 알고 있음을 나타내기 위해 다른 플래그와 함께 비트 OR이어야 합니다.

Windows 11 부터 지원합니다.

[in, out] numPathArrayElements

pPathInfoArray의 요소 수를 포함하는 변수에 대한 포인터입니다. 이 매개 변수는 NULL일 수 없습니다. QueryDisplayConfig가 ERROR_SUCCESS 반환하는 경우 pNumPathInfoElementspPathInfoArray의 유효한 항목 수로 업데이트됩니다.

[out] pathArray

DISPLAYCONFIG_PATH_INFO 요소의 배열을 포함하는 변수에 대한 포인터입니다. pPathInfoArray의 각 요소는 원본에서 대상으로의 단일 경로를 설명합니다. 원본 및 대상 모드 정보 인덱스는 API에 대해 동시에 반환되는 pmodeInfoArray 테이블과 함께만 유효합니다. 이 매개 변수는 NULL일 수 없습니다. pPathInfoArray는 항상 경로 우선 순위 순서로 반환됩니다. 경로 우선 순위 순서에 대한 자세한 내용은 경로 우선 순위 순서를 참조하세요.

[in, out] numModeInfoArrayElements

모드 정보 테이블의 요소에 있는 숫자를 지정하는 변수에 대한 포인터입니다. 이 매개 변수는 NULL일 수 없습니다. QueryDisplayConfig가 ERROR_SUCCESS 반환하는 경우 pNumModeInfoArrayElementspModeInfoArray의 유효한 항목 수로 업데이트됩니다.

[out] modeInfoArray

DISPLAYCONFIG_MODE_INFO 요소의 배열을 포함하는 변수에 대한 포인터입니다. 이 매개 변수는 NULL일 수 없습니다.

[out, optional] currentTopologyId

CCD 데이터베이스에서 현재 활성 토폴로지의 식별자를 수신하는 변수에 대한 포인터입니다. 가능한 값 목록은 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
시스템에서 WDDM(Windows 디스플레이 드라이버 모델)에 따라 작성된 그래픽 드라이버를 실행하고 있지 않습니다. 함수는 WDDM 드라이버가 실행되는 시스템에서만 지원됩니다.
ERROR_ACCESS_DENIED
호출자는 콘솔 세션에 액세스할 수 없습니다. 이 오류는 호출 프로세스에서 현재 데스크톱에 액세스할 수 없거나 원격 세션에서 실행 중인 경우에 발생합니다.
ERROR_GEN_FAILURE
지정되지 않은 오류가 발생했습니다.
ERROR_INSUFFICIENT_BUFFER
제공된 경로 및 모드 버퍼가 너무 작습니다.

설명

GetDisplayConfigBufferSizes 함수는 특정 순간에만 필요한 배열 크기를 결정할 수 있으므로 GetDisplayConfigBufferSizesQueryDisplayConfig 호출 사이에 시스템 구성이 변경되고 제공된 배열 크기가 더 이상 새 경로 데이터를 저장하기에 충분하지 않을 수 있습니다. 이 경우 QueryDisplayConfig 는 ERROR_INSUFFICIENT_BUFFER 실패하고 호출자는 GetDisplayConfigBufferSizes 를 다시 호출하여 새 배열 크기를 가져와야 합니다. 그런 다음 호출자는 올바른 양의 메모리를 할당해야 합니다.

QueryDisplayConfig는 pPathInfoArray 매개 변수가 지정하는 경로 배열의 경로와 pModeInfoArray 매개 변수가 지정하는 모드 배열 의 원본 및 대상 모드를 반환합니다. QueryDisplayConfig 는 항상 경로 우선 순위 순서로 경로를 반환합니다. Flags 매개 변수에 QDC_ALL_PATHS 설정되면 QueryDisplayConfig는 활성 경로 다음에 모든 비활성 경로를 반환합니다.

전체 경로, 소스 모드 및 대상 모드 정보는 모든 활성 경로에 사용할 수 있습니다. 원본 및 대상에 대한 DISPLAYCONFIG_PATH_SOURCE_INFODISPLAYCONFIG_PATH_TARGET_INFO 구조체의 ModeInfoIdx 멤버가 이러한 활성 경로에 대해 설정됩니다. 비활성 경로의 경우 반환된 원본 및 대상 모드 정보를 사용할 수 없습니다. 따라서 경로 구조의 대상 정보는 기본값으로 설정되고 원본 및 대상 모드 인덱스는 잘못된 것으로 표시됩니다. 데이터베이스 쿼리의 경우 현재 연결 모니터에 항목이 있는 경우 QueryDisplayConfig 는 전체 경로, 원본 모드 및 대상 모드 정보(활성 경로의 경우와 동일)를 반환합니다. 그러나 데이터베이스에 항목이 없는 경우 QueryDisplayConfig 는 기본 대상 세부 정보가 포함된 경로 정보만 반환합니다(비활성 경로의 경우와 동일).

원본 및 대상 모드 정보가 경로 정보와 어떻게 관련되는지에 대한 예제는 경로 정보에 대한 모드 정보의 관계를 참조하세요.

호출자는 DisplayConfigGetDeviceInfo 를 사용하여 원본 또는 대상 디바이스(예: 모니터 이름 및 모니터 기본 모드 및 원본 디바이스 이름)에 대한 추가 정보를 얻을 수 있습니다.

대상이 현재 강제로 프로젝팅되는 경우 DISPLAYCONFIG_PATH_TARGET_INFO 구조체의 statusFlags 멤버에는 DISPLAYCONFIG_TARGET_FORCED_XXX 플래그 집합 중 하나가 있습니다.

flags 매개 변수 에 QDC_DATABASE_CURRENT 플래그가 설정된 경우 QueryDisplayConfigpCurrentTopologyId 매개 변수가 가리키는 변수에서 활성 데이터베이스 토폴로지의 토폴로지 식별자를 반환합니다. flags 매개 변수 에 QDC_ALL_PATHS 또는 QDC_ONLY_ACTIVE_PATHS 플래그가 설정된 경우 pCurrentTopologyId 매개 변수를 NULL로 설정해야 합니다. 그렇지 않으면 QueryDisplayConfig 는 ERROR_INVALID_PARAMETER 반환합니다.

호출자가 Flags 매개 변수에 설정된 QDC_DATABASE_CURRENT 플래그를 사용하여 QueryDisplayConfig를 호출하는 경우 QueryDisplayConfigDISPLAYCONFIG_VIDEO_SIGNAL_INFO 구조체의 totalSize 멤버에 지정된 DISPLAYCONFIG_2DREGION 구조를 0으로 초기화하고 DISPLAYCONFIG_2DREGION 완료하지 않습니다.

EnumDisplaySettings Win32 함수(Windows SDK 설명서에 설명됨)에서 반환되는 DEVMODE 구조체에는 원본 모드와 대상 모드 모두와 관련된 정보가 포함되어 있습니다. 그러나 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 크리에이터 업데이트에 추가되었습니다.

DPI 가상화

이 API는 DPI 가상화에 참여하지 않습니다. DEVMODE 구조체의 모든 크기는 물리적 픽셀의 측면에서 이며 호출 컨텍스트와 관련이 없습니다.

예제

다음 예제에서는 QueryDisplayConfigGetDisplayConfigBufferSizes 를 사용하여 활성 표시 경로를 열거하고 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 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 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