调用GetSystemMetrics(SM_MOUSEHORIZONTALWHEELPRESENT)始终返回0的问题求助
GetSystemMetrics(SM_MOUSEHORIZONTALWHEELPRESENT)返回0但鼠标实际支持水平滚轮的解决方案
问题原因
GetSystemMetrics(SM_MOUSEHORIZONTALWHEELPRESENT)返回的是系统级的水平滚轮支持状态,而非当前连接的单个鼠标设备的硬件能力。即使你的鼠标硬件具备水平滚轮,如果系统未全局启用该功能、驱动未正确适配,或者该API的检测逻辑未识别到设备的水平滚轮属性,就会返回0。而你通过原始输入(Raw Input)获取的fHasHorizontalWheel == TRUE是单个设备的硬件属性,这两者的检测维度不同。
解决办法
- 直接基于原始输入结果判断:既然你已经能通过原始输入API拿到设备的
fHasHorizontalWheel字段,完全可以用这个值来判断当前设备是否支持水平滚轮,这是最准确的方式。示例代码片段:// 枚举原始输入设备时的检测逻辑 RID_DEVICE_INFO_MOUSE mouseInfo = {0}; mouseInfo.cbSize = sizeof(RID_DEVICE_INFO_MOUSE); if (GetRawInputDeviceInfo(hDevice, RIDI_DEVICEINFO, &mouseInfo, &cbSize) != -1) { if (mouseInfo.fHasHorizontalWheel) { // 当前设备支持水平滚轮 } } - 检查系统与驱动状态:
- 重新安装或更新鼠标官方驱动,确保驱动正确识别水平滚轮功能;
- 打开控制面板的「鼠标」设置,确认水平滚轮的相关选项已启用;
- 尝试重启系统,让设备驱动和系统设置生效。
- 验证API调用正确性:确认调用
GetSystemMetrics时参数无误,SM_MOUSEHORIZONTALWHEELPRESENT的宏定义值为0x0064,避免因参数传错导致返回值异常。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

