123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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;
- }
- }
- }
|