Énumération et contrôle 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 sur le bureau qui croisent une région de découpage, appelez EnumDisplayMonitors. Cette opération renvoie 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 appareil d’affichage, utilisez EnumDisplaySettings ou EnumDisplaySettingsEx.
La fonction ChangeDisplaySettingsEx est utilisée pour contrôler les appareils d’affichage sur l’ordinateur. Elle peut modifier la configuration des appareils, telles que la spécification de la position d’un moniteur sur le bureau virtuel et la modification de 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 programmation, 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 adjacent à 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 appareil 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 qui ne le sont pas, par le biais de 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 ChangeDisplaySettingsEx de nouveau pour modifier dynamiquement les paramètres, sans redémarrage requis.