首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ChangeDisplaySettings似乎只适用于主监视器(返回DISP_CHANGE_BADMODE)

ChangeDisplaySettings似乎只适用于主监视器(返回DISP_CHANGE_BADMODE)
EN

Stack Overflow用户
提问于 2020-04-01 01:53:10
回答 1查看 902关注 0票数 1

我的系统中有两种显示器:笔记本显示器和外部显示器。独立的是主屏幕,我想改变屏幕的旋转。我从http://msdn.microsoft.com/en-us/library/ms812499.aspx中的示例开始,这是我的简单测试代码:

代码语言:javascript
运行
复制
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 = 1ChangeDisplaySettings将返回DISP_CHANGE_BADMODE。似乎只有这样才能改变主显示器的旋转。

相反,如果我将外部监视器设置为主显示器,那么对于displayNumber = 1来说,事情就会像预期的那样工作。但是,使用displayNumber = 0时,外部监视器上的设置会变得一团糟,而膝上型计算机显示器(第一次显示)会像预期的那样旋转。

这里发生了什么事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 02:19:33

我似乎需要使用ChangeDisplaySettingsEx代替,并明确指定显示设备。我在https://gist.github.com/umq/986635上找到了一个可以工作的示例代码。

而不是

代码语言:javascript
运行
复制
long lRet = ChangeDisplaySettings(&dm, 0);

写:

代码语言:javascript
运行
复制
long lRet = ChangeDisplaySettingsEx(dd.DeviceName, &dm, NULL, 0, NULL);

好了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60962494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档