Enumerations- und Anzeigesteuerelement

Um alle Geräte auf dem Computer aufzuzählen, rufen Sie die EnumDisplayDevices-Funktion auf. Die zurückgegebenen Informationen geben auch an, welcher Monitor Teil des Desktops ist.

Um die Geräte auf dem Desktop aufzuzählen, die einen Clippingbereich überschneiden, rufen Sie EnumDisplayMonitors auf. Dadurch wird das HMONITOR-Handle an jeden Monitor zurückgegeben, der mit GetMonitorInfoverwendet wird. Um alle Geräte auf dem virtuellen Bildschirm aufzuzählen, verwenden Sie EnumDisplayMonitors. wie im folgenden Code gezeigt:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Verwenden Sie EnumDisplaySettings oder EnumDisplaySettingsEx, um Informationen zu einem Anzeigegerät abzurufen.

Die ChangeDisplaySettingsEx-Funktion wird verwendet, um die Anzeigegeräte auf dem Computer zu steuern. Sie kann die Konfiguration der Geräte ändern, z. B. die Position eines Monitors auf dem virtuellen Desktop angeben und die Bittiefe einer beliebigen Anzeige ändern. In der Regel verwendet eine Anwendung diese Funktion nicht. Um einem System mit mehreren Monitoren programmgesteuert einen Anzeigemonitor hinzuzufügen, legen Sie DEVMODE.dmFields auf DM _ POSITION fest, und geben Sie eine Position (mit DEVMODE.dmPosition) für den Monitor an, den Sie hinzufügen, der an mindestens ein Pixel des Anzeigebereichs eines vorhandenen Monitors angrenzt. Um den Monitor zu trennen, legen Sie DEVMODE.dmFields auf DM _ POSITION und DEVMODE.dmPelsWidth und DEVMODE.dmPelsHeight auf 0 (null) fest.

Der folgende Code veranschaulicht, wie alle sekundären Anzeigegeräte vom Desktop getrennt werden:

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
}

Für jedes Anzeigegerät kann die Anwendung Informationen in der Registrierung speichern, die die Konfigurationsparameter für das Gerät sowie Standortparameter beschreiben. Die Anwendung kann auch mithilfe des Flags DISPLAY DEVICE ATTACHED TO DESKTOP in der _ _ DISPLAY _ _ _ DEVICE-Struktur ermitteln, welche Anzeigen Teil des Desktops sind und welche nicht. Nachdem alle Konfigurationsinformationen in der Registrierung gespeichert wurden, kann die Anwendung ChangeDisplaySettingsEx erneut aufrufen, um die Einstellungen dynamisch zu ändern, ohne dass ein Neustart erforderlich ist.