怎样捕获鼠标滚轮的向上和向下消息

解决方案 »

  1.   

    OnMouseWheel()
    两个消息分别是:
    WM_LBUTTONDOWN 
    WM_LBUTTONUP
      

  2.   

            [DllImport("user32.dll")]
            public static extern bool ReleaseCapture();
            [DllImport("user32.dll")]
            public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int   
            lParam);//API函数
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;namespace Hook
    {
        class Hook
        {
            [StructLayout(LayoutKind.Sequential)]
            private class POINT
            {
                public int x;
                public int y;
            }        [StructLayout(LayoutKind.Sequential)]
            private class MouseHookStruct
            {
                public POINT pt;
                public int hwnd;
                public int wHitTestCode;
                public int dwExtraInfo;
            }        [StructLayout(LayoutKind.Sequential)]
            private class MouseLLHookStruct
            {
                public POINT pt;
                public int mouseData;
                public int flags;
                public int time;
                public int dwExtraInfo;
            }        
            [DllImport("kernel32")]
            public static extern int GetCurrentThreadId();        [DllImport("user32.dll")]
            private static extern int SetWindowsHookEx(
                int idHook,
                HookProc lpfn,
                IntPtr hMod,
                int dwThreadId);        [DllImport("user32.dll")]
            private static extern int UnhookWindowsHookEx(int idHook);        [DllImport("user32.dll")]
            private static extern int CallNextHookEx(
                int idHook,
                int nCode,
                int wParam,
                IntPtr lParam);        private delegate int HookProc(int nCode, int wParam, IntPtr lParam);
            private const int WH_MOUSE = 7;
            private const int WM_MOUSEWHEEL = 0x020A;
            private int hMouseHook = 0;
            private static HookProc KeyboardProcedure;
           
            private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
            {
                if (nCode >= 0)
                {
                    switch (wParam)
                    {
                        case WM_MOUSEWHEEL:
                            {
                                MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));                            //mouseHookStruct.mouseData 就是Delta
                                //下面是MSDN中的解释
                                //如是消息是WM_MOUSEWHELL  mouseData中的高位(高16位)就是Delta
                                //鼠标轮将轮和鼠标按钮的功能结合在了一起。鼠标轮有一些相互分开的、间距均匀的凹口。当您旋转鼠标轮时,每碰到一个凹口就会发送一个鼠标轮消息。
                                //Windows 常数 WHEEL_DELTA 定义了一个鼠标轮凹口,即一个制动器,值为120。
                                //正值指示鼠标轮向前(远离用户的方向)转动;负值指示鼠标轮向后(朝着用户的方向)转动。
                                //当前,120 是一个制动器的标准值。如果使用分辨率更高的鼠标,则 WHEEL_DATA 定义的值可能会更小。
                                //大多数应用程序都应检查值为正还是为负,而不是值聚合总数。                                                        
                                break;
                            }
                        
                    }
     
                }
                return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
            }              public bool StartMouseHook()
            {
                MouseHookProcedure = new HookProc(MouseHookProc);            hMouseHook = SetWindowsHookEx(WH_MOUSE,
                    MouseHookProcedure,
                    IntPtr.Zero,
                    GetCurrentThreadId());            if (hMouseHook == 0)
                    return false;
                else
                    return true;        }
           
            public bool StopMouseHook()
            {
                int retMouse = UnhookWindowsHookEx(hMouseHook);
                if (retMouse == 0)
                    return true;
                else
                    return false;
            }
        }
    }
      

  4.   

    一般不会向上滚轮和向下滚轮两个事件的,除非自己设相应的MESSAGE,重载windows procedure。大部分控件都带MouseWheel事件的吧,相应的事件参数类型是MouseEventArgs。
    MouseEventArgs有个delta属性,在这个事件中表示滚轮滚动的度数,若为正则滚轮的方向为向前推(远离你,即你说的“向上”),否则为向后拨(靠近你,即你说的“向下”)。如果你要重载windows procedure的话,相应的Message为WM_MOUSEWHEEL(据我所知没有直接分出滚轮滚动方向的两个事件),这个Message的wParam的高16位与上述MouseEventArgs的delta意义类似,正负方向相同。详见http://msdn.microsoft.com/en-us/library/ms645617(v=VS.85).aspx