在项目中想修改当前屏幕的刷新率,使用函数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修改屏幕刷新率】