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.