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

如何在使用JNA监听鼠标事件时区分滚轮上下滚动

区分JNA鼠标滚轮上下滚动的方法

嘿,我之前也碰到过一模一样的问题!用JNA监听鼠标事件时,确实会发现所有滚轮操作都返回同一个事件码(就是你说的522,对应Windows的WM_MOUSEWHEEL常量),这是因为滚轮的方向信息根本不在事件码里,而是藏在事件的附加参数中。

要区分上下滚动,你需要从事件的wParam参数里提取滚轮增量,具体步骤如下:

核心原理

Windows系统中,WM_MOUSEWHEEL事件的wParam是一个32位值:

  • 高16位存储的是滚轮增量值:向上滚动时为+120(每滚动一格的标准增量),向下滚动时为-120
  • 低16位则是鼠标按键的状态(对滚轮方向判断没用)

我们只需要提取高16位的数值,通过正负就能直接区分滚动方向。

代码示例

假设你用的是JNA的低级别鼠标钩子,修改你的回调函数就能实现:

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class MouseWheelListener implements WinUser.LowLevelMouseProc {
    @Override
    public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wParam, WinUser.MOUSEHOOKSTRUCTEX lParam) {
        // 过滤出滚轮事件(WM_MOUSEWHEEL的十进制就是522)
        if (nCode >= 0 && wParam.intValue() == WinUser.WM_MOUSEWHEEL) {
            // 用JNA的工具方法提取wParam的高16位,得到滚轮增量
            int wheelDelta = WinUser.HIWORD(wParam);
            
            if (wheelDelta > 0) {
                System.out.println("滚轮向上滚动");
                // 这里写你的向上滚动逻辑
            } else {
                System.out.println("滚轮向下滚动");
                // 这里写你的向下滚动逻辑
            }
        }
        // 记得把事件传递给下一个钩子,不然系统的鼠标事件会失效
        return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam.getPointer());
    }
}

补充说明

  • 有些高精度鼠标可能会返回非120的增量值(比如更大的数值),但正负方向是固定的,所以只需要判断wheelDelta的正负就足够区分上下,不用纠结具体数值。
  • 如果是横向滚轮(WM_MOUSEHWHEEL事件,十进制524),逻辑完全一致:增量为正是向右滚动,负则向左。

这样修改后,你就能准确区分滚轮的上下滚动操作啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:30