我正在尝试以编程方式更改系统分辨率。我需要实现的是将系统分辨率设置为最大值。
下面是将屏幕分辨率更改为最大可用值的代码。
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);
它可以正常工作,
但是当我从较低的值更改为较高值时,它不起作用,例如当前分辨率为1600X900,而当我更改为1920x1080时则不起作用。
我得到-2作为返回值,在文档中代表The graphics mode is not supported
。
答案 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
,它将在您的应用程序退出时还原设置。上例中的标志组合设置了所有用户的设置,将其存储在注册表中,并立即应用更改。