VC修改屏幕刷新率

在项目中想修改当前屏幕的刷新率,使用函数ChangeDisplaySettingsExA,但是遇到了如果当前刷新率是隔行扫描的(INTERLACED)需要修改为逐行扫描的刷新率返回-2(DISP_CHANGE_BADMODE),但是如果从逐行扫描的刷新率设置为隔行扫描就可以成功,只不过需要将DEVMODE结构的dmDisplayFlags标志与上DM_INTERLACED。我开始怀疑参数还是有问题,所有我尝试着将DEVMODE所有参数都获取出来,然后值修改刷新率参数和修改dmDisplayFlags标志,结果成功了。
主要代码如下:

//通过回调函数枚举所有显示器 BOOL bRet = EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, NULL ); BOOL CALLBACK MonitorEnumProc( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ) { MONITORINFOEX mi; mi.cbSize = sizeof( MONITORINFOEX ); GetMonitorInfo( hMonitor, &mi ); bool bPriMonitor = false; if ( mi.dwFlags == MONITORINFOF_PRIMARY )//可以判断当前显示器是不是主屏 { bPriMonitor = true; }DEVMODE modea; modea.dmSize = sizeof( DEVMODE ); EnumDisplaySettings( mi.szDevice, ENUM_CURRENT_SETTINGS, &modea ); //设置逐行扫描 60hz if (modea.dmDisplayFrequency != 60 ) { modea.dmDisplayFlags &= !DM_INTERLACED; modea.dmDisplayFrequency = 60; LONG lRet = ChangeDisplaySettingsEx( mi.szDevice, &modea, NULL, 0, NULL ); printf( "Ret is %d\r\n", lRet ); }return true; }

【VC修改屏幕刷新率】

    推荐阅读