我正在尝试以编程方式更改系统分辨率。 我需要实现的是将系统分辨率设置为最大值。
以下是将屏幕分辨率更改为最大可用值的代码。
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,当我改变到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
,它将在应用程序退出时恢复设置。 上面例子中的标志组合,设置所有用户的设置,将其存储在注册表中,并立即应用更改。