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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值