Windows更改系统解析c ++

时间:2016-06-08 10:26:41

标签: windows qt winapi

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

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

       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);

它可以正常工作,

  1. 当系统分辨率达到最大值(1920x1080)时,我会更改为相同的值。
  2. 当系统分辨率较高且我更改为较低值时。
  3. 但是当我从较低的值更改为较高值时,它不起作用,例如当前分辨率为1600X900,而当我更改为1920x1080时则不起作用。 我得到-2作为返回值,在文档中代表The graphics mode is not supported

1 个答案:

答案 0 :(得分:3)

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

首先,有一个错字。 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);

dmFields结构的DEVMODE成员是您告诉系统要更改哪些字段的位置。 ChangeDisplaySettings上的标志指定了这些设置的应用方式。 为什么DM_PELSWIDTH || DM_PELSHEIGHT进行的调用没有失败DISP_CHANGE_BADFLAGS的原因是1是CDS_UPDATEREGISTRY标志的值。

作为旁注:如果您只是暂时更改应用程序的分辨率(比如游戏),则单独传递标记CDS_FULLSCREEN,它将在您的应用程序退出时还原设置。上例中的标志组合设置了所有用户的设置,将其存储在注册表中,并立即应用更改。