【问题标题】:WndProc Hook lParam to xy cords?WndProc 将 lParam 连接到 xy 线?
【发布时间】:2012-03-17 09:17:35
【问题描述】:

在使用 WndProc 挂钩从 Win32 API 获取消息后,我正在尝试获取鼠标线。

下面是我的代码..它不长,应该很容易理解.. 我正在学习所有这些,只是不知道如何将 lParam 更改为点 x 和 y..

任何帮助都会很好,谢谢:)

    private const int WM_LEFTBUTTONDOWN = 0x0201;
    private const int WM_LEFTBUTTONUP = 0x0202;
    private const int WM_MOUSEMOVE = 0x0200;
    private const int WM_MOUSEWHEEL = 0x020A;
    private const int WM_RIGHTBUTTONDOWN = 0x0204;
    private const int WM_RIGHTBUTTONUP = 0x0205;


    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
        source.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {

        if (msg == WM_MOUSEMOVE)
        {
            label1.Content = "Msg: " + msg + " wParam: " + wParam + " lParam: " + lParam;
        }

        return IntPtr.Zero;
    }

【问题讨论】:

    标签: c# wpf winapi


    【解决方案1】:

    你可以使用Point(int dw)构造函数:

    Point point = new Point(lParam.ToInt32());
    ...
    

    来自MSDN关于int dw参数:

    dw 参数的低 16 位指定水平 x 坐标,高 16 位指定新点的垂直 y 坐标。

    【讨论】:

      【解决方案2】:

      x 坐标在低 16 位,y 在接下来的 16 位。像这样破解它:

      int x = (short)lParam.ToInt32();
      int y = lParam.ToInt32() >> 16;
      

      【讨论】:

        【解决方案3】:

        使用MSLLHOOKSTRUCT结构,在winuser.h

        见:winuser/ns-winuser-msllhookstruct

        private struct POINT
        {
            public int x;
            public int y;
        }
        
        private struct MSLLHOOKSTRUCT
        {
            public POINT pt;
            public uint mouseData, flags, time;
            public IntPtr dwExtraInfo;
        }
        
        MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
        int x = hookStruct.pt.x;
        int y = hookStruct.pt.y;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-14
          • 2018-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-20
          • 2015-01-07
          相关资源
          最近更新 更多