Contrôle d’énumération et d’affichage
Pour énumérer tous les appareils sur l’ordinateur, appelez la fonction EnumDisplayDevices . Les informations retournées indiquent également quel moniteur fait partie du bureau.
Pour énumérer les appareils du bureau qui croisent une zone de découpage, appelez EnumDisplayMonitors. Cela retourne le handle HMONITOR à chaque moniteur, qui est utilisé avec GetMonitorInfo. Pour énumérer tous les appareils de l’écran virtuel, utilisez EnumDisplayMonitors. comme indiqué dans le code suivant :
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
Pour obtenir des informations sur un périphérique d’affichage, utilisez EnumDisplaySettings ou EnumDisplaySettingsEx.
La fonction ChangeDisplaySettingsEx est utilisée pour contrôler les périphériques d’affichage sur l’ordinateur. Il peut modifier la configuration des appareils, par exemple en spécifiant la position d’un moniteur sur le bureau virtuel et en modifiant la profondeur de bits de n’importe quel affichage. En règle générale, une application n’utilise pas cette fonction. Pour ajouter un moniteur d’affichage à un système à plusieurs moniteurs par programme, définissez DEVMODE.dmFields sur DM_POSITION et spécifiez une position (à l’aide de DEVMODE.dmPosition ) pour le moniteur que vous ajoutez qui est adjacente à au moins un pixel de la zone d’affichage d’un moniteur existant. Pour détacher le moniteur, définissez DEVMODE.dmFields sur DM_POSITION et définissez DEVMODE.dmPelsWidth et DEVMODE.dmPelsHeight sur zéro.
Le code suivant montre comment détacher tous les appareils d’affichage secondaires du bureau :
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
}
Pour chaque périphérique d’affichage, l’application peut enregistrer des informations dans le Registre qui décrivent les paramètres de configuration de l’appareil, ainsi que les paramètres d’emplacement. L’application peut également déterminer quels affichages font partie du bureau et ceux qui ne le sont pas, via l’indicateur DISPLAY_DEVICE_ATTACHED_TO_DESKTOP dans la structure DISPLAY_DEVICE . Une fois que toutes les informations de configuration sont stockées dans le Registre, l’application peut appeler à nouveau ChangeDisplaySettingsEx pour modifier dynamiquement les paramètres, sans redémarrage requis.