В моей системе два дисплея: дисплей моего ноутбука и внешний монитор. Независимо от которого является основной экран, я хотел бы изменить поворот экрана. Я начал с примеров в 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
настройки на внешнем мониторе портятся, пока дисплей ноутбука (первый дисплей) вращается, как и ожидалось.
Что здесь происходит?