我的系统中有两种显示器:笔记本显示器和外部显示器。独立的是主屏幕,我想改变屏幕的旋转。我从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
将返回DISP_CHANGE_BADMODE
。似乎只有这样才能改变主显示器的旋转。
相反,如果我将外部监视器设置为主显示器,那么对于displayNumber = 1
来说,事情就会像预期的那样工作。但是,使用displayNumber = 0
时,外部监视器上的设置会变得一团糟,而膝上型计算机显示器(第一次显示)会像预期的那样旋转。
这里发生了什么事?
发布于 2020-04-01 02:19:33
我似乎需要使用ChangeDisplaySettingsEx
代替,并明确指定显示设备。我在https://gist.github.com/umq/986635上找到了一个可以工作的示例代码。
而不是
long lRet = ChangeDisplaySettings(&dm, 0);
写:
long lRet = ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, 0, NULL);
好了。
https://stackoverflow.com/questions/60962494
复制相似问题