Кажется, что ChangeDisplaySettings работает только для основного монитора (возвращает DISP_CHANGE_BADMODE) - PullRequest
1 голос
/ 01 апреля 2020

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

Что здесь происходит?

1 Ответ

0 голосов
/ 01 апреля 2020

Кажется, мне нужно использовать ChangeDisplaySettingsEx и явно указывать устройство отображения. Я нашел пример кода на https://gist.github.com/umq/986635, который работает.

Вместо

long lRet = ChangeDisplaySettings(&dm, 0);

запись:

long lRet = ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, 0, NULL);

Готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...