Opsommings- en weergavebesturingselement
Als u alle apparaten op de computer wilt inventariseren, roept u de functie EnumDisplayDevices aan. De informatie die wordt geretourneerd, geeft ook aan welke monitor deel uitmaakt van het bureaublad.
Als u de apparaten op het bureaublad wilt inventariseren die een knipregio doorkruisen, roept u EnumDisplayMonitorsaan. Hiermee wordt de HMONITOR-ingang geretourneerd aan elke monitor, die wordt gebruikt met GetMonitorInfo-. Als u alle apparaten in het virtuele scherm wilt inventariseren, gebruikt u EnumDisplayMonitors. zoals weergegeven in de volgende code:
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
Gebruik EnumDisplaySettings of EnumDisplaySettingsExom informatie over een weergaveapparaat op te halen.
De functie ChangeDisplaySettingsEx wordt gebruikt om de weergaveapparaten op de computer te beheren. Het kan de configuratie van de apparaten wijzigen, zoals het opgeven van de positie van een monitor op het virtuele bureaublad en het wijzigen van de bitdiepte van elke weergave. Normaal gesproken gebruikt een toepassing deze functie niet. Als u een beeldschermmonitor programmatisch wilt toevoegen aan een systeem met meerdere beeldschermen, stelt u DEVMODE.dmFields in op DM_POSITION en geeft u een positie op (met behulp van DEVMODE.dmPosition) voor de monitor die u toevoegt die grenst aan ten minste één pixel van het weergavegebied van een bestaande monitor. Als u de monitor wilt loskoppelen, stelt u DEVMODE.dmFields in op DM_POSITION en stelt u DEVMODE.dmPelsWidth- en DEVMODE.dmPelsHeight in op nul.
De volgende code laat zien hoe u alle secundaire weergaveapparaten loskoppelt van het bureaublad:
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
}
Voor elk weergaveapparaat kan de toepassing informatie opslaan in het register waarin de configuratieparameters voor het apparaat worden beschreven, evenals locatieparameters. De toepassing kan ook bepalen welke weergaven deel uitmaken van het bureaublad en welke niet, via de DISPLAY_DEVICE_ATTACHED_TO_DESKTOP vlag in de DISPLAY_DEVICE structuur. Zodra alle configuratiegegevens zijn opgeslagen in het register, kan de toepassing ChangeDisplaySettingsEx opnieuw aanroepen om de instellingen dynamisch te wijzigen, zonder dat opnieuw opstarten is vereist.