关于ChangeDisplaySettings失败的几个原因
此问题也不知道是否可以放在这个类别下询问,呵呵。
本程序主要应用于Vista。使用方法如下(程序片段):
DEVMODE DevMode;
ZeroMemory(&DevMode, sizeof(DEVMODE));
DevMode.dmSize = sizeof(DEVMODE);
DevMode.dmPelsWidth = aDisplayMode.Width;
DevMode.dmPelsHeight = aDisplayMode.Height;
DevMode.dmBitsPerPel = aDisplayMode.BitsPerPixel;
DevMode.dmDisplayFrequency = aDisplayMode.RefreshRate;
DevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
LONG lResult = DISP_CHANGE_SUCCESSFUL;
if ( DISP_CHANGE_SUCCESSFUL != (lResult = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN)) )
{
switch (lResult)
{
case DISP_CHANGE_BADDUALVIEW:
Record(_T("[Result] DISP_CHANGE_BADDUALVIEW"));
break;
case DISP_CHANGE_BADFLAGS:
Record(_T("[Result] DISP_CHANGE_BADFLAGS"));
break;
case DISP_CHANGE_BADMODE:
Record(_T("[Result] DISP_CHANGE_BADMODE"));
break;
case DISP_CHANGE_BADPARAM:
Record(_T("[Result] DISP_CHANGE_BADPARAM"));
break;
case DISP_CHANGE_FAILED:
Record(_T("[Result] DISP_CHANGE_FAILED"));
break;
case DISP_CHANGE_NOTUPDATED:
Record(_T("[Result] DISP_CHANGE_NOTUPDATED"));
break;
case DISP_CHANGE_RESTART:
Record(_T("[Result] DISP_CHANGE_RESTART"));
break;
default:
Record(_T("[Result] Unknown"));
break;
}
return;
}
此函数失败的方法有:
1、参数填写错误,决定权算是在于DevMode.dmFields的填写。
2、所使用的分辨率是当前系统不支持的。
3、在程式运行前,按下了ctrl+alt+del,出现了"lock computer"等菜单的画面,或win+L。
4、在运行瞬间,系统正在进行休眠等动作。
5、系统设置了,切换分辨率需要重启机器,即"DISP_CHANGE_RESTART"
但我现在的使用场景,可以确保1,2,5是不会出现的:
本次碰到的错误是偶尔产生的,因此,如果1出现,则应该每次执行都会失败。
使用EnumDisplaySettings获取monitor支持的分辨率,所以2不会出现。
程式运行期产生的记录文件里,没有"DISP_CHANGE_RESTART"。
既然要用这个程式,就不会去锁定屏幕,使机器休眠。而事先也会设置不需屏保,关闭电源管理选项等。
但程式运行期仍会偶发的出现"DISP_CHANGE_FAILED"。
因此,还有其他原因会导致这种现象发生吗??