Sdílet prostřednictvím


Výčet a ovládací prvek zobrazení

Chcete-li zobrazit výčet všech zařízení v počítači, zavolejte funkci EnumDisplayDevices. Vrácené informace také označují, který monitor je součástí plochy.

Chcete-li vytvořit výčet zařízení na ploše, která protínají oblast výřezu, zavolejte EnumDisplayMonitors. Tím se vrátí popisovač HMONITOR pro každý monitor, který se používá s GetMonitorInfo. Chcete-li zobrazit výčet všech zařízení na virtuální obrazovce, použijte EnumDisplayMonitors. jak je znázorněno v následujícím kódu:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Chcete-li získat informace o zobrazovacím zařízení, použijte EnumDisplaySettings nebo EnumDisplaySettingsEx.

Funkce ChangeDisplaySettingsEx slouží k řízení zobrazovaných zařízení v počítači. Může upravit konfiguraci zařízení, například určit umístění monitoru na virtuální ploše a změnit bitovou hloubku libovolného displeje. Aplikace tuto funkci obvykle nepoužívá. Chcete-li přidat monitor zobrazení do systému s více monitory programově, nastavte DEVMODE.dmFields na DM_POSITION a zadejte pozici (pomocí DEVMODE.dmPosition) pro monitor, který přidáváte, který sousedí s alespoň jedním pixelem oblasti zobrazení existujícího monitoru. Pokud chcete monitorování odpojit, nastavte DEVMODE.dmFields na DM_POSITION a nastavte DEVMODE.dmPelsWidth a DEVMODE.dmPelsHeight na nulu.

Následující kód ukazuje, jak odpojit všechna sekundární zařízení zobrazení z plochy:

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
}

Pro každé zobrazovací zařízení může aplikace ukládat informace v registru, které popisují parametry konfigurace zařízení a také parametry umístění. Aplikace může také určit, která zobrazení jsou součástí plochy a které nejsou, prostřednictvím příznaku DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ve struktuře DISPLAY_DEVICE. Jakmile jsou všechny informace o konfiguraci uloženy v registru, může aplikace volat ChangeDisplaySettingsEx dynamicky měnit nastavení bez nutnosti restartování.