Элемент управления перечислением и отображением

Чтобы перечислить все устройства на компьютере, вызовите функцию EnumDisplayDevices . Возвращаемые сведения также указывают, какой монитор является частью рабочего стола.

Чтобы перечислить устройства на рабочем столе, которые пересекаются с обрезкой области, вызовите EnumDisplayMonitors. Он возвращает дескриптор HMONITOR для каждого монитора, который используется с GetMonitorInfo. Чтобы перечислить все устройства на виртуальном экране, используйте EnumDisplayMonitors. Как показано в следующем коде:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Чтобы получить сведения об устройстве отображения, используйте EnumDisplaySettings или EnumDisplaySettingsEx.

Функция ChangeDisplaySettingsEx используется для управления устройствами отображения на компьютере. Он может изменять конфигурацию устройств, например указывать положение монитора на виртуальном рабочем столе и изменять битовую глубину любого дисплея. Как правило, приложение не использует эту функцию. Чтобы добавить монитор дисплея в систему с несколькими мониторами программным способом, задайте для DEVMODE.dmFields значение DM_POSITION и укажите позицию (с помощью DEVMODE.dmPosition ) для добавляемого монитора, который находится рядом по крайней мере с одним пикселем области отображения существующего монитора. Чтобы отсоединить монитор, установите для параметра DEVMODE.dmFields значение DM_POSITION и задайте для devmode.dmPelsWidth и DEVMODE.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_ATTACHED_TO_DESKTOP в структуре DISPLAY_DEVICE . После сохранения всех сведений о конфигурации в реестре приложение может снова вызвать ChangeDisplaySettingsEx для динамического изменения параметров без необходимости перезапуска.