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
相关产品推荐
相关产品推荐

