Partilhar via


Enumeração e controle de exibição

Para enumerar todos os dispositivos no computador, chame o EnumDisplayDevices função. As informações retornadas também indicam qual monitor faz parte da área de trabalho.

Para enumerar os dispositivos na área de trabalho que cruzam uma região de recorte, chame EnumDisplayMonitors. Isso retorna o identificador HMONITOR para cada monitor, que é usado com GetMonitorInfo. Para enumerar todos os dispositivos na tela virtual, use EnumDisplayMonitors. conforme mostrado no código a seguir:

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

Para obter informações sobre um dispositivo de exibição, use EnumDisplaySettings ou EnumDisplaySettingsEx.

A funçãoChangeDisplaySettingsEx é usada para controlar os dispositivos de exibição no computador. Ele pode modificar a configuração dos dispositivos, como especificar a posição de um monitor na área de trabalho virtual e alterar a profundidade de bits de qualquer monitor. Normalmente, um aplicativo não usa essa função. Para adicionar um monitor de vídeo a um sistema de vários monitores programaticamente, defina DEVMODE.dmFields para DM_POSITION e especifique uma posição (usando DEVMODE.dmPosition ) para o monitor que você está adicionando que seja adjacente a pelo menos um pixel da área de exibição de um monitor existente. Para desanexar o monitor, defina DEVMODE.dmFields como DM_POSITION e defina DEVMODE.dmPelsWidth e DEVMODE.dmPelsHeight zero.

O código a seguir demonstra como desanexar todos os dispositivos de vídeo secundários da área de trabalho:

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
}

Para cada dispositivo de exibição, o aplicativo pode salvar informações no registro que descrevem os parâmetros de configuração para o dispositivo, bem como parâmetros de localização. O aplicativo também pode determinar quais monitores fazem parte da área de trabalho, e quais não são, através do sinalizador DISPLAY_DEVICE_ATTACHED_TO_DESKTOP na estrutura DISPLAY_DEVICE. Uma vez que todas as informações de configuração são armazenadas no registro, o aplicativo pode chamar ChangeDisplaySettingsEx novamente para alterar dinamicamente as configurações, sem necessidade de reinicialização.