Enumerasi dan Kontrol Tampilan

Untuk menghitung semua perangkat di komputer, panggil fungsi EnumDisplayDevices . Informasi yang dikembalikan juga menunjukkan monitor mana yang merupakan bagian dari desktop.

Untuk menghitung perangkat di desktop yang berpotongan wilayah kliping, panggil EnumDisplayMonitors. Ini mengembalikan handel HMONITOR ke setiap monitor, yang digunakan dengan GetMonitorInfo. Untuk menghitung semua perangkat di layar virtual, gunakan EnumDisplayMonitors. seperti yang ditunjukkan dalam kode berikut:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Untuk mendapatkan informasi tentang perangkat tampilan, gunakan EnumDisplaySettings atau EnumDisplaySettingsEx.

Fungsi ChangeDisplaySettingsEx digunakan untuk mengontrol perangkat tampilan di komputer. Ini dapat memodifikasi konfigurasi perangkat, seperti menentukan posisi monitor di desktop virtual dan mengubah kedalaman bit tampilan apa pun. Biasanya, aplikasi tidak menggunakan fungsi ini. Untuk menambahkan monitor tampilan ke sistem multi-monitor secara terprogram, atur DEVMODE.dmFields ke DM_POSITION dan tentukan posisi (menggunakan DEVMODE.dmPosition ) untuk monitor yang Anda tambahkan yang berdekatan dengan setidaknya satu piksel area tampilan monitor yang ada. Untuk melepaskan monitor, atur DEVMODE.dmFields ke DM_POSITION dan atur DEVMODE.dmPelsWidth dan DEVMODE.dmPelsHeight ke nol.

Kode berikut menunjukkan cara melepaskan semua perangkat tampilan sekunder dari 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
}

Untuk setiap perangkat tampilan, aplikasi dapat menyimpan informasi dalam registri yang menjelaskan parameter konfigurasi untuk perangkat, serta parameter lokasi. Aplikasi ini juga dapat menentukan tampilan mana yang merupakan bagian dari desktop, dan mana yang tidak, melalui bendera DISPLAY_DEVICE_ATTACHED_TO_DESKTOP dalam struktur DISPLAY_DEVICE . Setelah semua informasi konfigurasi disimpan di registri, aplikasi dapat memanggil ChangeDisplaySettingsEx lagi untuk mengubah pengaturan secara dinamis, tanpa perlu menghidupkan ulang.