Windows 更改系统分辨率 C++

Har*_*ris 2 windows winapi qt

我正在尝试以编程方式更改系统分辨率。我需要实现的是将系统分辨率设置为最大值。

下面是将屏幕分辨率更改为最大可用值的代码。

       DEVMODE devmode = { 0 };

       int i=0;
       QList<int>widths;
       QList<int>heights;
       while (1) {
           if(EnumDisplaySettings( NULL,i, &devmode )!=true)
                break;

           widths.append(devmode.dmPelsWidth);
           heights.append(devmode.dmPelsHeight);

           qDebug()<<devmode.dmPelsWidth<<" X "<<devmode.dmPelsHeight;

           i++;

       }

       EnumDisplaySettings( NULL,ENUM_CURRENT_SETTINGS, &devmode );

       devmode.dmSize = sizeof(DEVMODE);
       devmode.dmPelsWidth = widths.at(widths.size()-1); //take last item maximum value
       devmode.dmPelsHeight = heights.at(widths.size()-1); //take last item maximum value

       long result = ChangeDisplaySettings(&devmode, DM_PELSWIDTH || DM_PELSHEIGHT);
Run Code Online (Sandbox Code Playgroud)

它在以下情况下工作正常,

  1. 当系统分辨率为最大(1920x1080)时,我更改为相同的值。
  2. 当系统分辨率更高并且我更改为更低的值时。

但是当我从较低值更改为较高值时它不起作用,例如当前分辨率为 1600X900,当我更改为 1920x1080 时它不起作用。我得到 -2 作为返回值,这The graphics mode is not supported在文档中代表。

the*_*heB 5

您调用函数的方式有两个问题。

首先,有一个错字。DM_PELSWIDTH || DM_PELSHEIGHT计算结果为 1,而不是两个标志的组合。你可能是说DM_PELSWIDTH | DM_PELSHEIGHT

其次,那些不是您应该传递给的标志ChangeDisplaySettings。以下是调用该函数的正确方法:

DEVMODE desiredMode = { 0 };
desiredMode.dmSize = sizeof(DEVMODE);
desiredMode.dmPelsWidth = 1920;
desiredMode.dmPelsHeight = 1080;
desiredMode.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH;
LONG res = ChangeDisplaySettings(&desiredMode, CDS_UPDATEREGISTRY | CDS_GLOBAL | CDS_RESET);
Run Code Online (Sandbox Code Playgroud)

结构的dmFields成员DEVMODE是您告诉系统您要更改哪些字段的地方。上的标志ChangeDisplaySettings指定如何应用这些设置。究其原因,为什么与呼叫DM_PELSWIDTH || DM_PELSHEIGHT没有失败DISP_CHANGE_BADFLAGS的是,1是价值CDS_UPDATEREGISTRY的标志。

附带说明:如果您只是临时更改应用程序的分辨率(就像游戏一样),则CDS_FULLSCREEN自行传递标志,它会在您的应用程序退出时恢复设置。上例中的标志组合为所有用户设置设置,将其存储在注册表中,并立即应用更改。