当API函数ChangeDisplaySettings返回DISP_CHANGE_BADMODE(-2)时,表示尝试设置的显示模式不受支持或无效。这可能是由于指定的分辨率、刷新率或颜色位深度不被显示设备所支持。
要解决这个问题,您可以尝试以下几种方法:
DEVMODE devMode;
devMode.dmSize = sizeof(DEVMODE);
int iModeNum = 0;
while (EnumDisplaySettings(NULL, iModeNum, &devMode))
{
// 检查显示模式是否匹配
if (devMode.dmPelsWidth == desiredWidth && devMode.dmPelsHeight == desiredHeight && devMode.dmBitsPerPel == desiredBitsPerPixel && devMode.dmDisplayFrequency == desiredRefreshRate)
{
// 显示模式匹配
break;
}
iModeNum++;
}
检查显示模式的有效性:确保指定的显示模式参数是有效的。例如,分辨率不能为负数,刷新率不能为零等。
降低显示模式参数:如果指定的显示模式不受支持,可以尝试降低分辨率、刷新率或颜色位深度,然后再次尝试设置。
DEVMODE devMode;
devMode.dmSize = sizeof(DEVMODE);
devMode.dmPelsWidth = newWidth;
devMode.dmPelsHeight = newHeight;
devMode.dmBitsPerPel = newBitsPerPixel;
devMode.dmDisplayFrequency = newRefreshRate;
devMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
LONG result = ChangeDisplaySettings(&devMode, CDS_FULLSCREEN);
if (result == DISP_CHANGE_SUCCESSFUL)
{
// 显示模式设置成功
}
else
{
// 显示模式设置失败,处理错误
}
请注意,使用ChangeDisplaySettings函数更改显示模式可能会导致屏幕闪烁或重新布局,并且用户的桌面上的窗口可能会被最小化或关闭。因此,在更改显示模式之前,最好先通知用户并得到确认。