MouseHook.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. using System.Reflection;
  3. using System.Runtime.InteropServices;
  4. using System.Windows.Forms;
  5. namespace GUI.Hook
  6. {
  7. public class MouseHook : IHook
  8. {
  9. int hHook = 0;
  10. Win32Api.HookProc mouseHookDelegate;
  11. public event MouseEventHandler OnMouseMoveEvent;
  12. public event MouseEventHandler OnMouseDownEvent;
  13. public event MouseEventHandler OnMouseUpEvent;
  14. public MouseHook() { }
  15. public void SetHook()
  16. {
  17. mouseHookDelegate = new Win32Api.HookProc(MouseHookProc);
  18. hHook = Win32Api.SetWindowsHookEx(Win32Api.WH_MOUSE_LL, mouseHookDelegate, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
  19. }
  20. public void UnHook()
  21. {
  22. Win32Api.UnhookWindowsHookEx(hHook);
  23. }
  24. int MouseHookProc(int nCode, int wParam, IntPtr lParam)
  25. {
  26. Win32Api.MouseHookStruct msg = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));
  27. if (nCode >= 0)
  28. {
  29. switch (wParam)
  30. {
  31. case 513: OnMouseDownEvent?.Invoke(this, new(MouseButtons.Left, 0, msg.pt.x, msg.pt.y, 0)); break;
  32. case 514: OnMouseUpEvent?.Invoke(this, new(MouseButtons.Left, 0, msg.pt.x, msg.pt.y, 0)); break;
  33. case 516: OnMouseDownEvent?.Invoke(this, new(MouseButtons.Right, 0, msg.pt.x, msg.pt.y, 0)); break;
  34. case 517: OnMouseUpEvent?.Invoke(this, new(MouseButtons.Right, 0, msg.pt.x, msg.pt.y, 0)); break;
  35. default: OnMouseMoveEvent?.Invoke(this, new(MouseButtons.None, 0, msg.pt.x, msg.pt.y, 0)); break;
  36. }
  37. }
  38. return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
  39. }
  40. }
  41. }