using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace LYFZ.OtherExpansion.SkinControl { public class MouseHook { public struct POINT { public int X; public int Y; } public struct MSLLHOOTSTRUCT { public MouseHook.POINT pt; public int mouseData; public int flags; public int time; public int dwExtraInfo; } public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); public delegate void MHookEventHandler(object sender, MHookEventArgs e); private const int WH_MOUSE_LL = 14; private const uint WM_LBUTTONDOWN = 513u; private const uint WM_LBUTTONUP = 514u; private const uint WM_RBUTTONDOWN = 516u; private const uint WM_RBUTTONUP = 517u; private IntPtr hHook = IntPtr.Zero; private GCHandle gc; public event MouseHook.MHookEventHandler MHookEvent; public IntPtr HHook { get { return this.hHook; } } [DllImport("user32.dll")] public static extern IntPtr SetWindowsHookEx(int idHook, MouseHook.HookProc lpfn, IntPtr hmod, int dwThreadid); [DllImport("user32.dll")] public static extern int CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern bool UnhookWindowsHookEx(IntPtr hHook); [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string lpModuleName); private int MouseHookProcedure(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && this.MHookEvent != null) { MouseHook.MSLLHOOTSTRUCT stMSLL = (MouseHook.MSLLHOOTSTRUCT)Marshal.PtrToStructure(lParam, typeof(MouseHook.MSLLHOOTSTRUCT)); ButtonStatus btnStatus = ButtonStatus.None; if (wParam == (IntPtr)513L) { btnStatus = ButtonStatus.LeftDown; } else { if (wParam == (IntPtr)514L) { btnStatus = ButtonStatus.LeftUp; } else { if (wParam == (IntPtr)516L) { btnStatus = ButtonStatus.RightDown; } else { if (wParam == (IntPtr)517L) { btnStatus = ButtonStatus.RightUp; } } } } this.MHookEvent(this, new MHookEventArgs(btnStatus, stMSLL.pt.X, stMSLL.pt.Y)); } return MouseHook.CallNextHookEx(this.hHook, nCode, wParam, lParam); } public bool SetHook() { if (this.hHook != IntPtr.Zero) { return false; } MouseHook.HookProc mouseCallBack = new MouseHook.HookProc(this.MouseHookProcedure); this.hHook = MouseHook.SetWindowsHookEx(14, mouseCallBack, MouseHook.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); if (this.hHook != IntPtr.Zero) { this.gc = GCHandle.Alloc(mouseCallBack); return true; } return false; } public bool UnLoadHook() { if (this.hHook == IntPtr.Zero) { return false; } if (MouseHook.UnhookWindowsHookEx(this.hHook)) { this.hHook = IntPtr.Zero; this.gc.Free(); return true; } return false; } } }