You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinGW环境下Win32控制台ReadConsoleInput()鼠标滚轮输入异常问题

鼠标滚轮滚动值解析问题解决

问题根源

你碰到的情况是类型符号处理的问题:

  • 微软文档里说的“高字包含正值/非正值”,实际是指这个16位的值是有符号的(向前滚+120,向后滚-120)
  • 但HIWORD()宏返回的是WORD类型——也就是无符号16位整数。当向后滚时,-120的无符号16位表示就是65416(65536-120),直接用%d输出的话,会被当成正数打印,和预期不符。

修复代码

只需要把HIWORD的结果强制转换成有符号的SHORT类型,就能得到正确的正负值:

#include <stdio.h>
#include <windows.h>

int main(void)
{
    INPUT_RECORD ir[128];
    HANDLE       hStdInput  = NULL;
    HANDLE       hStdOutput = NULL;
    DWORD        nRead;
    COORD        xy;

    DWORD fdwSaveOldMode;
    int i;

    hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleMode(hStdInput, &fdwSaveOldMode);
    SetConsoleMode(hStdInput, ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS);
    FlushConsoleInputBuffer(hStdInput);
    ReadConsoleInput(hStdInput, ir, 128, &nRead);

    for(i = 0; i < nRead; i++)
    {
        if(ir[i].EventType == MOUSE_EVENT)
        {
            if(ir[i].Event.MouseEvent.dwEventFlags == MOUSE_WHEELED)
            {
                // 转换为有符号SHORT,解析正确的正负增量
                short wheelDelta = (short)HIWORD(ir[i].Event.MouseEvent.dwButtonState);
                printf("滚轮增量: %d\n", wheelDelta);
            }
        }
    }

    // 恢复控制台原有模式,避免影响后续操作
    SetConsoleMode(hStdInput, fdwSaveOldMode);
    return 0;
}

额外说明

  • Windows鼠标滚轮的标准增量是±120,每滚动一个物理刻度对应这个数值
  • 强制转成SHORT后,无符号的65416会被正确识别为-120,完全符合文档里“非正值表示向后滚动”的描述

内容的提问来源于stack exchange,提问作者Chief Cook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:47:10