【问题标题】:GET_WHEEL_DELTA_WPARAM macro in C#C# 中的 GET_WHEEL_DELTA_WPARAM 宏
【发布时间】:2012-03-07 08:32:32
【问题描述】:

如何在 C# 中使用 GET_WHEEL_DELTA_WPARAM 宏?

【问题讨论】:

  • 此处需要进行健全性检查。您不能使用 C# 编写由全局挂钩调用的代码。这需要一个可注入的 DLL。
  • 使用 dllimport 从 C# 对我来说似乎有点工作,但有时会占用 windows 'n stuff

标签: c# c++ macros mouseevent mousewheel


【解决方案1】:

高位词,有符号:

 ((short)(wParam>>16))

【讨论】:

  • 我的方法:public static short GetWheelDeltaWParam(int wparam) { return (short)(wparam >> 16); },但它总是返回零。我这样称呼它:GetWheelDeltaWParam((int)wParam);
  • 如果这不起作用,请尝试 GetWDWP(unsigned int wparam) { return (short)((unsigned short)(wparam>>16)); }
  • 不幸的是没有..第一个应该可以工作,但它没有
  • 你确定你的 wparam 是正确的吗?问题可能不在此函数中。我不明白为什么它应该为零。
  • 可能是这种情况,但我不明白如何移动鼠标滚轮并生成此事件,以便 WHEEL_DELTA 为 0
【解决方案2】:

这里是MouseWheelEventArgs.Delta Property

获取一个值,该值指示鼠标滚轮的变化量。

private void MouseWheelHandler(object sender, MouseWheelEventArgs e)
{
    if (e.Delta > 0)
    {
        // Do one thing
    }
    else if (e.Delta < 0)
    {
        // Do the other thing
    }
}

【讨论】:

  • 不幸的是我忘了提到我正在使用来自 user32.dll 的全局钩子和 dllimport 所以我无法访问这些花哨的对象..
【解决方案3】:

为了最清楚,我会定义一组这样的函数:

internal static class NativeMethods
{
    internal static ushort HIWORD(IntPtr dwValue)
    {
        return (ushort)((((long)dwValue) >> 0x10) & 0xffff);
    }

    internal static ushort HIWORD(uint dwValue)
    {
        return (ushort)(dwValue >> 0x10);
    }

    internal static int GET_WHEEL_DELTA_WPARAM(IntPtr wParam)
    {
        return (short)HIWORD(wParam);
    }

    internal static int GET_WHEEL_DELTA_WPARAM(uint wParam)
    {
        return (short)HIWORD(wParam);
    }
}

然后像这样使用函数,其中wParam 是您从处理Win32 WM_MOUSEWHEELWM_MOUSEHWHEEL 消息时获得的WPARAM 参数:

int zDelta = NativeMethods.GET_WHEEL_DELTA_WPARAM(wParam);

您可能需要禁止溢出检查以使其正常工作。为此,请更改您的项目设置,或将相关的转换函数封装在 unchecked block 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多