MouseHook.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.InteropServices;
  4. using HandyControl.Data;
  5. using HandyControl.Tools.Interop;
  6. namespace HandyControl.Tools;
  7. internal class MouseHook
  8. {
  9. public static event EventHandler<MouseHookEventArgs> StatusChanged;
  10. private static IntPtr HookId = IntPtr.Zero;
  11. private static readonly InteropValues.HookProc Proc = HookCallback;
  12. private static int Count;
  13. public static void Start()
  14. {
  15. if (HookId == IntPtr.Zero)
  16. {
  17. HookId = SetHook(Proc);
  18. }
  19. if (HookId != IntPtr.Zero)
  20. {
  21. Count++;
  22. }
  23. }
  24. public static void Stop()
  25. {
  26. Count--;
  27. if (Count < 1)
  28. {
  29. InteropMethods.UnhookWindowsHookEx(HookId);
  30. HookId = IntPtr.Zero;
  31. }
  32. }
  33. private static IntPtr SetHook(InteropValues.HookProc proc)
  34. {
  35. using var curProcess = Process.GetCurrentProcess();
  36. using var curModule = curProcess.MainModule;
  37. if (curModule != null)
  38. {
  39. return InteropMethods.SetWindowsHookEx((int) InteropValues.HookType.WH_MOUSE_LL, proc,
  40. InteropMethods.GetModuleHandle(curModule.ModuleName), 0);
  41. }
  42. return IntPtr.Zero;
  43. }
  44. private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
  45. {
  46. if (nCode < 0) return InteropMethods.CallNextHookEx(HookId, nCode, wParam, lParam);
  47. var hookStruct = (InteropValues.MOUSEHOOKSTRUCT) Marshal.PtrToStructure(lParam, typeof(InteropValues.MOUSEHOOKSTRUCT));
  48. StatusChanged?.Invoke(null, new MouseHookEventArgs
  49. {
  50. MessageType = (MouseHookMessageType) wParam,
  51. Point = new InteropValues.POINT(hookStruct.pt.X, hookStruct.pt.Y)
  52. });
  53. return InteropMethods.CallNextHookEx(HookId, nCode, wParam, lParam);
  54. }
  55. }