从 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_MOUSEWHEE
L。
if (eventType == WM_MOUSE**H**WHEEL)
int wheelMovement = GetWheelDeltaWParam(eventType);
你确定这就是你想要的吗?也许只是在这里替换WM_MOUSEWHEEL
,以及其他建议。
【讨论】:
【参考方案2】:问题在于GET_WHEEL_DELTA_WPARAM
用于从WindowProc
的wParam
中提取鼠标滚轮增量,而您拥有的是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 正文消息