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)