Freigeben über


Enumerations- und Anzeigesteuerelement

Rufen Sie die Funktion EnumDisplayDevices auf, um alle Geräte auf dem Computer aufzulisten. Die zurückgegebenen Informationen geben auch an, welcher Monitor Teil des Desktops ist.

Rufen Sie EnumDisplayMonitors auf, um die Geräte auf dem Desktop aufzulisten, die einen Clippingbereich überschneiden. Dadurch wird das HMONITOR-Handle für jeden Monitor zurückgegeben, das mit GetMonitorInfo verwendet wird. Um alle Geräte auf dem virtuellen Bildschirm aufzulisten, verwenden Sie EnumDisplayMonitors. Wie im folgenden Code gezeigt:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Um Informationen zu einem Anzeigegerät abzurufen, verwenden Sie EnumDisplaySettings oder EnumDisplaySettingsEx.

Die ChangeDisplaySettingsEx-Funktion wird verwendet, um die Anzeigegeräte auf dem Computer zu steuern. Es 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 (mithilfe von DEVMODE.dmPosition ) für den hinzuzufügenden Monitor eine Position an, die neben mindestens einem Pixel des Anzeigebereichs eines vorhandenen Monitors liegt. Um den Monitor zu trennen, legen Sie DEVMODE.dmFields auf DM_POSITION und DEVMODE.dmPelsWidth und DEVMODE.dmPelsHeight auf null fest.

Der folgende Code veranschaulicht, wie Sie alle sekundären Anzeigegeräte vom Desktop trennen:

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 bestimmen, welche Anzeigen Teil des Desktops sind und welche nicht, über das flag DISPLAY_DEVICE_ATTACHED_TO_DESKTOP in der DISPLAY_DEVICE-Struktur . Sobald alle Konfigurationsinformationen in der Registrierung gespeichert sind, kann die Anwendung ChangeDisplaySettingsEx erneut aufrufen, um die Einstellungen dynamisch zu ändern, ohne dass ein Neustart erforderlich ist.