다음을 통해 공유


열거형 및 표시 컨트롤

컴퓨터의 모든 디바이스를 열거하려면 EnumDisplayDevices 함수를 호출합니다. 반환되는 정보는 바탕 화면의 일부인 모니터도 나타냅니다.

클리핑 영역을 교차하는 데스크톱의 디바이스를 열거하려면 EnumDisplayMonitors를 호출합니다. 그러면 GetMonitorInfo와 함께 사용되는 각 모니터에 HMONITOR 핸들이 반환됩니다. 가상 화면의 모든 디바이스를 열거하려면 EnumDisplayMonitors를 사용합니다. 다음 코드와 같이

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

디스플레이 디바이스에 대한 정보를 얻으려면 EnumDisplaySettings 또는 EnumDisplaySettingsEx를 사용합니다.

ChangeDisplaySettingsEx 함수는 컴퓨터의 디스플레이 디바이스를 제어하는 데 사용됩니다. 가상 데스크톱에서 모니터의 위치를 지정하고 디스플레이의 비트 깊이를 변경하는 등 디바이스의 구성을 수정할 수 있습니다. 일반적으로 애플리케이션은 이 함수를 사용하지 않습니다. 프로그래밍 방식으로 다중 모니터 시스템에 디스플레이 모니터를 추가하려면 DEVMODE.dmFields 를 DM_POSITION 설정하고 기존 모니터의 디스플레이 영역 중 하나 이상에 인접한 추가 중인 모니터에 대한 위치( DEVMODE.dmPosition 사용)를 지정합니다. 모니터를 분리하려면 DEVMODE.dmFields 를 DM_POSITION 설정하고 DEVMODE.dmPelsWidthDEVMODE.dmPelsHeight 를 0으로 설정합니다.

다음 코드는 데스크톱에서 모든 보조 디스플레이 디바이스를 분리하는 방법을 보여 줍니다.

void DetachDisplay()
{
    BOOL            FoundSecondaryDisp = FALSE;
    DWORD           DispNum = 0;
    DISPLAY_DEVICE  DisplayDevice;
    LONG            Result;
    TCHAR           szTemp[200];
    int             i = 0;
    DEVMODE   defaultMode;

    // initialize DisplayDevice
    ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
    DisplayDevice.cb = sizeof(DisplayDevice);

    // get all display devices
    while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))
        {
        ZeroMemory(&defaultMode, sizeof(DEVMODE));
        defaultMode.dmSize = sizeof(DEVMODE);
        if ( !EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &defaultMode) )
                  OutputDebugString("Store default failed\n");

        if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) &&
            !(DisplayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
            {
            DEVMODE    DevMode;
            ZeroMemory(&DevMode, sizeof(DevMode));
            DevMode.dmSize = sizeof(DevMode);
            DevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION
                        | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS ;
            Result = ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName, 
                                            &DevMode,
                                            NULL,
                                            CDS_UPDATEREGISTRY,
                                            NULL);

            //The code below shows how to re-attach the secondary displays to the desktop

            //ChangeDisplaySettingsEx((LPSTR)DisplayDevice.DeviceName,
            //                       &defaultMode,
            //                       NULL,
            //                       CDS_UPDATEREGISTRY,
            //                       NULL);

            }

        // Reinit DisplayDevice just to be extra clean

        ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
        DisplayDevice.cb = sizeof(DisplayDevice);
        DispNum++;
        } // end while for all display devices
}

각 디스플레이 디바이스에 대해 애플리케이션은 디바이스의 구성 매개 변수와 위치 매개 변수를 설명하는 정보를 레지스트리에 저장할 수 있습니다. 또한 애플리케이션은 DISPLAY_DEVICE 구조의 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 플래그를 통해 데스크톱의 일부인 디스플레이와 그렇지 않은 디스플레이를 확인할 수도 있습니다. 모든 구성 정보가 레지스트리에 저장되면 애플리케이션은 ChangeDisplaySettingsEx를 다시 호출하여 다시 시작하지 않고도 설정을 동적으로 변경할 수 있습니다.