ChangeDisplaySettings 似乎只适用于主监视器 (returns DISP_CHANGE_BADMODE)
ChangeDisplaySettings only seems to work for primary monitor (returns DISP_CHANGE_BADMODE)
我的系统中有两个显示器:笔记本电脑显示器和外接显示器。 Independent 从哪个是主屏幕,我想改变屏幕旋转。我从 http://msdn.microsoft.com/en-us/library/ms812499.aspx 中的示例开始,这是我的简单测试代码:
DWORD displayNumber = 1;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
if (0 != EnumDisplayDevices(NULL, displayNumber , &dd, EDD_GET_DEVICE_INTERFACE_NAME))
{
if (0 != EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm))
{
// swap height and width
DWORD dwTemp = dm.dmPelsHeight;
dm.dmPelsHeight = dm.dmPelsWidth;
dm.dmPelsWidth = dwTemp;
// determine new orientaion
switch (dm.dmDisplayOrientation)
{
case DMDO_DEFAULT:
dm.dmDisplayOrientation = DMDO_270;
break;
case DMDO_270:
dm.dmDisplayOrientation = DMDO_180;
break;
case DMDO_180:
dm.dmDisplayOrientation = DMDO_90;
break;
case DMDO_90:
dm.dmDisplayOrientation = DMDO_DEFAULT;
break;
default:
break;
}
long lRet = ChangeDisplaySettings(&dm, 0);
if (DISP_CHANGE_SUCCESSFUL != lRet)
{
switch (lRet)
{
case DISP_CHANGE_BADDUALVIEW:
MessageBox(0, _T("DISP_CHANGE_BADDUALVIEW"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADFLAGS:
MessageBox(0, _T("DISP_CHANGE_BADFLAGS"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADMODE:
MessageBox(0, _T("DISP_CHANGE_BADMODE"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADPARAM:
MessageBox(0, _T("DISP_CHANGE_BADPARAM"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_FAILED:
MessageBox(0, _T("DISP_CHANGE_FAILED"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_NOTUPDATED:
MessageBox(0, _T("DISP_CHANGE_NOTUPDATED"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_RESTART:
MessageBox(0, _T("DISP_CHANGE_RESTART"), _T("ChangeDisplaySettings failed"), 0);
break;
default:
MessageBox(0, _T("default"), _T("ChangeDisplaySettings failed"), 0);
break;
}
}
}
}
现在,第一个显示器是笔记本电脑显示器(也是主显示器),第二个显示器是外接显示器。
如果我用 displayNumber = 0
执行上面的代码,一切都按预期工作:笔记本电脑屏幕旋转,主屏幕保持原样。
但是,如果我设置displayNumber = 1
,ChangeDisplaySettings
returns DISP_CHANGE_BADMODE
。似乎只能通过这种方式更改主显示器的旋转。
相反,如果我将外接显示器设置为主显示器,displayNumber = 1
会按预期工作。然而,displayNumber = 0
,如预期的那样,当笔记本电脑显示屏(第一个显示屏)旋转时,外接显示器上的设置变得一团糟。
这是怎么回事?
看来我需要使用 ChangeDisplaySettingsEx
来代替并明确指定显示设备。我在 https://gist.github.com/umq/986635 上找到了一个有效的示例代码。
而不是
long lRet = ChangeDisplaySettings(&dm, 0);
写:
long lRet = ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, 0, NULL);
完成。
我的系统中有两个显示器:笔记本电脑显示器和外接显示器。 Independent 从哪个是主屏幕,我想改变屏幕旋转。我从 http://msdn.microsoft.com/en-us/library/ms812499.aspx 中的示例开始,这是我的简单测试代码:
DWORD displayNumber = 1;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
if (0 != EnumDisplayDevices(NULL, displayNumber , &dd, EDD_GET_DEVICE_INTERFACE_NAME))
{
if (0 != EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm))
{
// swap height and width
DWORD dwTemp = dm.dmPelsHeight;
dm.dmPelsHeight = dm.dmPelsWidth;
dm.dmPelsWidth = dwTemp;
// determine new orientaion
switch (dm.dmDisplayOrientation)
{
case DMDO_DEFAULT:
dm.dmDisplayOrientation = DMDO_270;
break;
case DMDO_270:
dm.dmDisplayOrientation = DMDO_180;
break;
case DMDO_180:
dm.dmDisplayOrientation = DMDO_90;
break;
case DMDO_90:
dm.dmDisplayOrientation = DMDO_DEFAULT;
break;
default:
break;
}
long lRet = ChangeDisplaySettings(&dm, 0);
if (DISP_CHANGE_SUCCESSFUL != lRet)
{
switch (lRet)
{
case DISP_CHANGE_BADDUALVIEW:
MessageBox(0, _T("DISP_CHANGE_BADDUALVIEW"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADFLAGS:
MessageBox(0, _T("DISP_CHANGE_BADFLAGS"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADMODE:
MessageBox(0, _T("DISP_CHANGE_BADMODE"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_BADPARAM:
MessageBox(0, _T("DISP_CHANGE_BADPARAM"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_FAILED:
MessageBox(0, _T("DISP_CHANGE_FAILED"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_NOTUPDATED:
MessageBox(0, _T("DISP_CHANGE_NOTUPDATED"), _T("ChangeDisplaySettings failed"), 0);
break;
case DISP_CHANGE_RESTART:
MessageBox(0, _T("DISP_CHANGE_RESTART"), _T("ChangeDisplaySettings failed"), 0);
break;
default:
MessageBox(0, _T("default"), _T("ChangeDisplaySettings failed"), 0);
break;
}
}
}
}
现在,第一个显示器是笔记本电脑显示器(也是主显示器),第二个显示器是外接显示器。
如果我用 displayNumber = 0
执行上面的代码,一切都按预期工作:笔记本电脑屏幕旋转,主屏幕保持原样。
但是,如果我设置displayNumber = 1
,ChangeDisplaySettings
returns DISP_CHANGE_BADMODE
。似乎只能通过这种方式更改主显示器的旋转。
相反,如果我将外接显示器设置为主显示器,displayNumber = 1
会按预期工作。然而,displayNumber = 0
,如预期的那样,当笔记本电脑显示屏(第一个显示屏)旋转时,外接显示器上的设置变得一团糟。
这是怎么回事?
看来我需要使用 ChangeDisplaySettingsEx
来代替并明确指定显示设备。我在 https://gist.github.com/umq/986635 上找到了一个有效的示例代码。
而不是
long lRet = ChangeDisplaySettings(&dm, 0);
写:
long lRet = ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, 0, NULL);
完成。