以下代码类型的工作。它不能保持监视器的分辨率。
void AppFrame::OnButtonModify(wxCommandEvent& event)
{
static bool bSwitch = false;
if (bSwitch)
{
ExtendExternalDisplay();
}
else
{
CloneExternalDisplay();
}
bSwitch = !bSwitch;
}
void AppFrame::ExtendExternalDisplay()
{
int nModeSwitch = NULL;
DEVMODE dmPrimary, dmSecondary, dmThird, savedmSecondary;
#define szPrimaryDisplay TEXT( "\\\\.\\DISPLAY1" )
#define szSecondaryDisplay TEXT( "\\\\.\\DISPLAY2" )
#define szThirdDisplay TEXT( "\\\\.\\DISPLAY3" )
ZeroMemory( &dmPrimary, sizeof(dmPrimary) );
dmPrimary.dmSize = sizeof(dmPrimary);
ZeroMemory( &dmSecondary, sizeof(dmSecondary) );
dmSecondary.dmSize = sizeof(dmSecondary);
ZeroMemory( &dmThird, sizeof(dmThird) );
dmThird.dmSize = sizeof(dmThird);
ZeroMemory( &dmThird, sizeof(dmThird) );
dmThird.dmSize = sizeof(dmThird);
BOOL result;
HDC handle;
DWORD iDevNum = 0;
DWORD dwFlags = 0;
DISPLAY_DEVICE lpDisplayDevice, lpDisplayDeviceOne, lpDisplayDeviceTwo;
ZeroMemory(&lpDisplayDevice, sizeof(lpDisplayDevice));
ZeroMemory(&lpDisplayDeviceOne, sizeof(lpDisplayDeviceOne));
ZeroMemory(&lpDisplayDeviceTwo, sizeof(lpDisplayDeviceTwo));
lpDisplayDevice.cb = sizeof(lpDisplayDevice);
lpDisplayDeviceOne.cb = sizeof(lpDisplayDeviceOne);
lpDisplayDeviceTwo.cb = sizeof(lpDisplayDeviceTwo);
while(EnumDisplayDevices(NULL, iDevNum, &lpDisplayDevice, dwFlags))
{
if (iDevNum == 0)
{
lpDisplayDeviceOne = lpDisplayDevice;
TRACE("DeviceName: '%s'\n", lpDisplayDeviceOne.DeviceName);
TRACE("DeviceString: '%s'\n", lpDisplayDeviceOne.DeviceString);
TRACE("Flags: %08X %s%s\n", lpDisplayDeviceOne.StateFlags,((lpDisplayDeviceOne.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ? "Desktop " : ""), ((lpDisplayDeviceOne.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? "Primary" : ""));
}
if (iDevNum == 1)
{
lpDisplayDeviceTwo = lpDisplayDevice;
TRACE("DeviceName: '%s'\n", lpDisplayDeviceTwo.DeviceName);
TRACE("DeviceString: '%s'\n", lpDisplayDeviceTwo.DeviceString);
TRACE("Flags: %08X %s%s\n", lpDisplayDeviceTwo.StateFlags,((lpDisplayDeviceTwo.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ? "Desktop " : ""), ((lpDisplayDeviceTwo.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? "Primary" : ""));
}
iDevNum ++;
}
if (!EnumDisplaySettings(szPrimaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmPrimary))
{
TRACE("EnumDisplaySettings unable to enumerate primary display\n");
return;
}
if (!EnumDisplaySettings(szSecondaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmSecondary))
TRACE("EnumDisplaySettings unable to enumerate secondary display display\n");
if (!EnumDisplaySettings(szSecondaryDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&savedmSecondary))
TRACE("EnumDisplaySettings unable to enumerate secondary display using ENUM_CURRENT_SETTINGS settings\n");
dmPrimary.dmFields = DM_POSITION;
dmPrimary.dmPosition.x = 0;
dmPrimary.dmPosition.y = 0;
nModeSwitch = ChangeDisplaySettingsEx (szPrimaryDisplay, (DEVMODE*)&dmPrimary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
dmSecondary = dmPrimary;
dmSecondary.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
dmSecondary.dmPosition.x = dmPrimary.dmPelsWidth + 1;
dmSecondary.dmPosition.y = 0;
dmSecondary.dmPelsWidth = dmPrimary.dmPelsWidth;
dmSecondary.dmPelsHeight = dmPrimary.dmPelsHeight;
nModeSwitch = ChangeDisplaySettingsEx (szSecondaryDisplay, (DEVMODE*)&dmSecondary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
if (!EnumDisplaySettings(szThirdDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&dmThird))
{
TRACE("EnumDisplaySettings unable to enumerate third display display\n");
}
else
{
dmThird.dmPelsWidth = dmSecondary.dmPelsWidth;
dmThird.dmPelsHeight = dmSecondary.dmPelsHeight;
dmThird.dmPosition.x = -dmThird.dmPelsWidth;
dmPrimary.dmPosition.y = 0;
nModeSwitch = ChangeDisplaySettingsEx (szThirdDisplay, (DEVMODE*)&dmThird, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
}
nModeSwitch = ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);
}
void AppFrame::CloneExternalDisplay()
{
int nModeSwitch = NULL;
DEVMODE dmPrimary, dmSecondary, dmThird;
#define szPrimaryDisplay TEXT( "\\\\.\\DISPLAY1" )
#define szSecondaryDisplay TEXT( "\\\\.\\DISPLAY2" )
#define szThirdDisplay TEXT( "\\\\.\\DISPLAY3" )
ZeroMemory( &dmPrimary, sizeof(dmPrimary) );
dmPrimary.dmSize = sizeof(dmPrimary);
ZeroMemory( &dmSecondary, sizeof(dmSecondary) );
dmSecondary.dmSize = sizeof(dmSecondary);
ZeroMemory( &dmThird, sizeof(dmThird) );
if (!EnumDisplaySettings(szPrimaryDisplay, ENUM_CURRENT_SETTINGS, (DEVMODE*)&dmPrimary))
{
TRACE("EnumDisplaySettings unable to enumerate primary display\n");
return;
}
if (!EnumDisplaySettingsEx(szSecondaryDisplay, ENUM_REGISTRY_SETTINGS, (DEVMODE*)&dmSecondary, 0))
TRACE("EnumDisplaySettings unable to enumerate secondary display display\n");
dmPrimary.dmFields = DM_POSITION;
dmPrimary.dmPosition.x = 0;
dmPrimary.dmPosition.y = 0;
nModeSwitch = ChangeDisplaySettingsEx (szPrimaryDisplay, (DEVMODE*)&dmPrimary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
dmSecondary.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
dmSecondary.dmPelsWidth = 0;
dmSecondary.dmPelsHeight = 0;
dmSecondary.dmFields |= DM_POSITION;
dmSecondary.dmPosition.x = 0;
dmSecondary.dmPosition.y = 0;
nModeSwitch = ChangeDisplaySettingsEx (szSecondaryDisplay, (DEVMODE*)&dmSecondary, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
nModeSwitch = ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);
}