代码之家  ›  专栏  ›  技术社区  ›  Hank

为全局鼠标挂钩创建新的MouseWheelEventArgs

  •  1
  • Hank  · 技术社区  · 11 年前

    根据下面的MSDN,是MouseWheelEventArgs构造函数

    public MouseWheelEventArgs(
        MouseDevice mouse,
        int timestamp,
        int delta
    )
    

    这是我正在尝试完成的“全局鼠标挂钩”中的一个方法:

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && MouseMessages.WM_MOUSEWHEEL == (MouseMessages)wParam)
        {
            MouseDevice mouseDev = InputManager.Current.PrimaryMouseDevice;
    
            MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
    
            //Initializes a new instance of the MouseWheelEventArgs class using the specified MouseDevice, timestamp, and delta.
            MouseAction(null, new MouseWheelEventArgs(mouseDev, timestamp, delta));
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
    

    我要找的是:

    时间戳-只需动态生成当前日期时间即可?

    delta-您必须能够以某种方式从鼠标设备以编程方式获取此信息,但如何实现?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Hans Passant    11 年前

    这个 Reference Source 可以向您展示 timestamp 从“Environment.TickCount”中检索。

    这个 MSDN Library article 对于MSLLHOOKSTRUCT delta 作为MSLLHOOKSTRUCT.mouseData元素的高位字传递。确保您将该成员声明为 整数 ,不作为 无符号整型 ,以便符号扩展正常工作。

    因此:

       int timestamp = Environment.TickCount;
       int delta = hookStruct.mouseData >> 16;
       MouseAction(null, new MouseWheelEventArgs(mouseDev, timestamp, delta));