Enumeração e controle de exibição
Para enumerar todos os dispositivos no computador, chame a função EnumDisplayDevices . 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ção ChangeDisplaySettingsEx é 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 exibição. Normalmente, um aplicativo não usa essa função. Para adicionar um monitor de exibição a um sistema de vários monitores programaticamente, defina DEVMODE.dmFields como DM_POSITION e especifique uma posição (usando DEVMODE.dmPosition ) para o monitor que você está adicionando que é 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 como zero.
O código a seguir demonstra como desanexar todos os dispositivos de exibição 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 telas fazem parte da área de trabalho e quais não são, por meio do sinalizador DISPLAY_DEVICE_ATTACHED_TO_DESKTOP na estrutura DISPLAY_DEVICE . Depois que todas as informações de configuração forem armazenadas no registro, o aplicativo poderá chamar ChangeDisplaySettingsEx novamente para alterar dinamicamente as configurações, sem necessidade de reinicialização.