关于ChangeDisplaySettings失败的几个原因

wdz609 2009-06-23 03:12:56
此问题也不知道是否可以放在这个类别下询问,呵呵。

本程序主要应用于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"。

因此,还有其他原因会导致这种现象发生吗??


...全文
687 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdz609 2009-07-07
  • 打赏
  • 举报
回复
自己顶一下,可不能沉下去,哈哈
wdz609 2009-06-29
  • 打赏
  • 举报
回复
没有人回答吗??
wdz609 2009-06-24
  • 打赏
  • 举报
回复
在MSDN中,ChangeDisplaySettings的描述里,没有说明可以用GetLastError()获取错误号。而且GetLastError()以前用过,得到的是0。
由于问题不是经常或一直出现,所以,也无法设置断点。
因此,那种方式不可行。

会不会因为显卡工作不正常?如果是,那么什么原因会导致显卡工作不正常?
老邓 2009-06-23
  • 打赏
  • 举报
回复
当 出现"DISP_CHANGE_FAILED" 时,GetLastError(),或设置断点看看。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧