Windows更改系统分辨率c ++

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

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

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. 当系统分辨率最大(1920×1080)时,我将更改为相同的值。
  2. 当系统分辨率较高时,我将更改为较低的值。

但是当我从较低的值改变到较高的值时,它不起作用,如当前的分辨率是1600X900,当我改变到1920×1080时,它不会工作。 我得到-2作为返回值,并表示The graphics mode is not supported文档。

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

首先,有一个错字。 DM_PELSWIDTH || DM_PELSHEIGHT DM_PELSWIDTH || DM_PELSHEIGHT计算结果为1,而不是两个标志的组合。 你可能意思是DM_PELSWIDTH | DM_PELSHEIGHT 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); 

DEVMODE结构的dmFields成员是您告诉系统您想要更改的字段的位置。 ChangeDisplaySettings上的标志指定如何应用这些设置。 与DM_PELSWIDTH || DM_PELSHEIGHT调用的原因 DM_PELSWIDTH || DM_PELSHEIGHT没有失败, DISP_CHANGE_BADFLAGS是1是CDS_UPDATEREGISTRY标志的值。

作为一个方面说明:如果你只是临时改变你的应用程序的分辨率(就像游戏一样),然后自己传递标志CDS_FULLSCREEN ,它将在应用程序退出时恢复设置。 上面例子中的标志组合,设置所有用户的设置,将其存储在注册表中,并立即应用更改。