从 C# 中 WM_MOUSEHWHEEL 消息中的 wParam 检索 WHEEL_DELTA

Posted

技术标签:

【中文标题】从 C# 中 WM_MOUSEHWHEEL 消息中的 wParam 检索 WHEEL_DELTA【英文标题】:retrieve WHEEL_DELTA from wParam in WM_MOUSEHWHEEL msg in C# 【发布时间】:2012-03-08 23:13:17 【问题描述】:

我在 C# 中使用来自 user32.dll 的全局挂钩和 dllimport。键盘一工作正常,但鼠标滚轮事件是一个问题。这是我的鼠标事件回调:

        private IntPtr MouseInputCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        
            if (nCode < 0) return CallNextHookEx(mouseHookId, nCode, wParam, lParam);

            int eventType = wParam.ToInt32();
            if (eventType == WM_MOUSEHWHEEL)
            
                int wheelMovement = GetWheelDeltaWParam(eventType);
            

            return CallNextHookEx(mouseHookId, nCode, wParam, lParam);
        

一切都很好,直到我必须检索 WHEEL_DELTA 值,该值显示了滚轮的滚动方式和滚动量。由于 C# 缺少 GET_WHEEL_DELTA_WPARAM 宏,因此我使用的代码应该可以完成这项工作:

私有静态 int GetWheelDeltaWParam(int wparam) return (int)(wparam >> 16);

但是输出总是0,没有任何意义。

编辑 - 结果:

        MSLLHOOKSTRUCT mouseData = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
        int wheelMovement = GetWheelDeltaWParam(mouseData.mouseData);

        [StructLayout(LayoutKind.Sequential)]
        private struct MSLLHOOKSTRUCT
        
            public Point pt;
            public int mouseData;
            public int flags;
            public int time;
            public long dwExtraInfo;
        

【问题讨论】:

似乎有些不对劲。您将 平等wParam 与消息 ID 进行比较,但随后希望相同值的前 16 位有所不同? 可能出了点问题,但在这种情况下,正确的解决方案是什么? 【参考方案1】:

你在这里寻找WM_MOUSE**H**WHEEL,它是车轮的水平运动(左右)

不是滚轮的滚动动作,即WM_MOUSEWHEEL。

        if (eventType == WM_MOUSE**H**WHEEL)
        
            int wheelMovement = GetWheelDeltaWParam(eventType);
        

你确定这就是你想要的吗?也许只是在这里替换WM_MOUSEWHEEL,以及其他建议。

【讨论】:

【参考方案2】:

问题在于GET_WHEEL_DELTA_WPARAM 用于从WindowProcwParam 中提取鼠标滚轮增量,而您拥有的是LowLevelMouseProc 回调强>。在your case,

wParam [in]

类型:WPARAM

鼠标消息的标识符。此参数可以是以下消息之一:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、 WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN 或 WM_RBUTTONUP。

wParam 就是WM_MOUSEWHEEL;要获得车轮三角洲,您需要查看

lParam [in]

类型:LPARAM

指向MSLLHOOKSTRUCT 结构的指针。

在该结构中,

鼠标数据

类型:DWORD

如果消息是WM_MOUSEWHEEL,则该成员的高位词是车轮增量。低位字被保留。一个积极的 值表示车轮向前旋转,远离 用户;负值表示***向后旋转, 向用户。一次滚轮点击定义为 WHEEL_DELTA,即 120.

你会发现你的价值。

请不要向我询问工作此结构所需的 C# P/Invoke 详细信息,因为我几乎肯定会弄错 :)

【讨论】:

以上是关于从 C# 中 WM_MOUSEHWHEEL 消息中的 wParam 检索 WHEEL_DELTA的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 中的 TCP 数据包中获取 Http 正文消息

C#消息队列零基础从入门到实战演练

如何从 c# 文件中获取带有退出代码的字符串消息以提供运行它的 .bat 文件

从响应消息 C# .NET 4.8 解析多部分文件

C# - 从特定应用程序捕获 Windows 消息

如何从 C# 客户端应用程序执行 ebMS3 AS4 消息传递