[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函数
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;
两个消息分别是:
WM_LBUTTONDOWN
WM_LBUTTONUP
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int
lParam);//API函数
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;
}
}
}
MouseEventArgs有个delta属性,在这个事件中表示滚轮滚动的度数,若为正则滚轮的方向为向前推(远离你,即你说的“向上”),否则为向后拨(靠近你,即你说的“向下”)。如果你要重载windows procedure的话,相应的Message为WM_MOUSEWHEEL(据我所知没有直接分出滚轮滚动方向的两个事件),这个Message的wParam的高16位与上述MouseEventArgs的delta意义类似,正负方向相同。详见http://msdn.microsoft.com/en-us/library/ms645617(v=VS.85).aspx