열거형 및 표시 컨트롤
컴퓨터의 모든 디바이스를 열거하려면 EnumDisplayDevices 함수를 호출합니다. 반환되는 정보는 바탕 화면의 일부인 모니터도 나타냅니다.
클리핑 영역을 교차하는 데스크톱의 디바이스를 열거하려면 EnumDisplayMonitors를 호출합니다. 그러면 GetMonitorInfo와 함께 사용되는 각 모니터에 HMONITOR 핸들이 반환됩니다. 가상 화면의 모든 디바이스를 열거하려면 EnumDisplayMonitors를 사용합니다. 다음 코드와 같이
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
디스플레이 디바이스에 대한 정보를 얻으려면 EnumDisplaySettings 또는 EnumDisplaySettingsEx를 사용합니다.
ChangeDisplaySettingsEx 함수는 컴퓨터의 디스플레이 디바이스를 제어하는 데 사용됩니다. 가상 데스크톱에서 모니터의 위치를 지정하고 디스플레이의 비트 깊이를 변경하는 등 디바이스의 구성을 수정할 수 있습니다. 일반적으로 애플리케이션은 이 함수를 사용하지 않습니다. 프로그래밍 방식으로 다중 모니터 시스템에 디스플레이 모니터를 추가하려면 DEVMODE.dmFields 를 DM_POSITION 설정하고 기존 모니터의 디스플레이 영역 중 하나 이상에 인접한 추가 중인 모니터에 대한 위치( DEVMODE.dmPosition 사용)를 지정합니다. 모니터를 분리하려면 DEVMODE.dmFields 를 DM_POSITION 설정하고 DEVMODE.dmPelsWidth 및 DEVMODE.dmPelsHeight 를 0으로 설정합니다.
다음 코드는 데스크톱에서 모든 보조 디스플레이 디바이스를 분리하는 방법을 보여 줍니다.
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
}
각 디스플레이 디바이스에 대해 애플리케이션은 디바이스의 구성 매개 변수와 위치 매개 변수를 설명하는 정보를 레지스트리에 저장할 수 있습니다. 또한 애플리케이션은 DISPLAY_DEVICE 구조의 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 플래그를 통해 데스크톱의 일부인 디스플레이와 그렇지 않은 디스플레이를 확인할 수도 있습니다. 모든 구성 정보가 레지스트리에 저장되면 애플리케이션은 ChangeDisplaySettingsEx를 다시 호출하여 다시 시작하지 않고도 설정을 동적으로 변경할 수 있습니다.