Enumerazione e controllo visualizzazione

Per enumerare tutti i dispositivi nel computer, chiamare la funzione EnumDisplayDevices . Le informazioni restituite indicano anche quale monitoraggio fa parte del desktop.

Per enumerare i dispositivi sul desktop che intersecano un'area di ritaglio, chiamare EnumDisplayMonitors. In questo modo viene restituito l'handle HMONITOR a ogni monitoraggio, usato con GetMonitorInfo. Per enumerare tutti i dispositivi nella schermata virtuale, usare EnumDisplayMonitors. come illustrato nel codice seguente:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Per ottenere informazioni su un dispositivo visualizzato, usare EnumDisplaySettings o EnumDisplaySettingsEx.

La funzione ChangeDisplaySettingsEx viene usata per controllare i dispositivi di visualizzazione nel computer. Può modificare la configurazione dei dispositivi, ad esempio specificando la posizione di un monitor sul desktop virtuale e modificando la profondità di bit di qualsiasi visualizzazione. In genere, un'applicazione non usa questa funzione. Per aggiungere un monitor visualizzato a un sistema a più monitor a livello di codice, impostare DEVMODE.dmFields su DM_POSITION e specificare una posizione (usando DEVMODE.dmPosition ) per il monitoraggio che si aggiunge adiacente a almeno un pixel dell'area di visualizzazione di un monitor esistente. Per scollegare il monitoraggio, impostare DEVMODE.dmFields su DM_POSITION e impostare DEVMODE.dmPelsWidth e DEVMODE.dmPelsHeight su zero.

Il codice seguente illustra come scollegare tutti i dispositivi di visualizzazione secondari dal desktop:

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
}

Per ogni dispositivo di visualizzazione, l'applicazione può salvare le informazioni nel Registro di sistema che descrive i parametri di configurazione per il dispositivo, nonché i parametri di posizione. L'applicazione può anche determinare quali visualizzazioni fanno parte del desktop e quali non sono, tramite il flag di DISPLAY_DEVICE_ATTACHED_TO_DESKTOP nella struttura DISPLAY_DEVICE . Una volta archiviate tutte le informazioni di configurazione nel Registro di sistema, l'applicazione può chiamare di nuovo ChangeDisplaySettingsEx per modificare dinamicamente le impostazioni, senza alcun riavvio richiesto.