using System; using System.Reflection; using System.Runtime.InteropServices; using System.Windows.Forms; namespace GUI.Hook { public class MouseHook : IHook { int hHook = 0; Win32Api.HookProc mouseHookDelegate; public event MouseEventHandler OnMouseMoveEvent; public event MouseEventHandler OnMouseDownEvent; public event MouseEventHandler OnMouseUpEvent; public MouseHook() { } public void SetHook() { mouseHookDelegate = new Win32Api.HookProc(MouseHookProc); hHook = Win32Api.SetWindowsHookEx(Win32Api.WH_MOUSE_LL, mouseHookDelegate, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); } public void UnHook() { Win32Api.UnhookWindowsHookEx(hHook); } int MouseHookProc(int nCode, int wParam, IntPtr lParam) { Win32Api.MouseHookStruct msg = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct)); if (nCode >= 0) { switch (wParam) { case 513: OnMouseDownEvent?.Invoke(this, new(MouseButtons.Left, 0, msg.pt.x, msg.pt.y, 0)); break; case 514: OnMouseUpEvent?.Invoke(this, new(MouseButtons.Left, 0, msg.pt.x, msg.pt.y, 0)); break; case 516: OnMouseDownEvent?.Invoke(this, new(MouseButtons.Right, 0, msg.pt.x, msg.pt.y, 0)); break; case 517: OnMouseUpEvent?.Invoke(this, new(MouseButtons.Right, 0, msg.pt.x, msg.pt.y, 0)); break; default: OnMouseMoveEvent?.Invoke(this, new(MouseButtons.None, 0, msg.pt.x, msg.pt.y, 0)); break; } } return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam); } } }