MouseHook.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.InteropServices;
  4. namespace LYFZ.OtherExpansion.SkinControl
  5. {
  6. public class MouseHook
  7. {
  8. public struct POINT
  9. {
  10. public int X;
  11. public int Y;
  12. }
  13. public struct MSLLHOOTSTRUCT
  14. {
  15. public MouseHook.POINT pt;
  16. public int mouseData;
  17. public int flags;
  18. public int time;
  19. public int dwExtraInfo;
  20. }
  21. public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  22. public delegate void MHookEventHandler(object sender, MHookEventArgs e);
  23. private const int WH_MOUSE_LL = 14;
  24. private const uint WM_LBUTTONDOWN = 513u;
  25. private const uint WM_LBUTTONUP = 514u;
  26. private const uint WM_RBUTTONDOWN = 516u;
  27. private const uint WM_RBUTTONUP = 517u;
  28. private IntPtr hHook = IntPtr.Zero;
  29. private GCHandle gc;
  30. public event MouseHook.MHookEventHandler MHookEvent;
  31. public IntPtr HHook
  32. {
  33. get
  34. {
  35. return this.hHook;
  36. }
  37. }
  38. [DllImport("user32.dll")]
  39. public static extern IntPtr SetWindowsHookEx(int idHook, MouseHook.HookProc lpfn, IntPtr hmod, int dwThreadid);
  40. [DllImport("user32.dll")]
  41. public static extern int CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
  42. [DllImport("user32.dll")]
  43. public static extern bool UnhookWindowsHookEx(IntPtr hHook);
  44. [DllImport("kernel32.dll")]
  45. public static extern IntPtr GetModuleHandle(string lpModuleName);
  46. private int MouseHookProcedure(int nCode, IntPtr wParam, IntPtr lParam)
  47. {
  48. if (nCode >= 0 && this.MHookEvent != null)
  49. {
  50. MouseHook.MSLLHOOTSTRUCT stMSLL = (MouseHook.MSLLHOOTSTRUCT)Marshal.PtrToStructure(lParam, typeof(MouseHook.MSLLHOOTSTRUCT));
  51. ButtonStatus btnStatus = ButtonStatus.None;
  52. if (wParam == (IntPtr)513L)
  53. {
  54. btnStatus = ButtonStatus.LeftDown;
  55. }
  56. else
  57. {
  58. if (wParam == (IntPtr)514L)
  59. {
  60. btnStatus = ButtonStatus.LeftUp;
  61. }
  62. else
  63. {
  64. if (wParam == (IntPtr)516L)
  65. {
  66. btnStatus = ButtonStatus.RightDown;
  67. }
  68. else
  69. {
  70. if (wParam == (IntPtr)517L)
  71. {
  72. btnStatus = ButtonStatus.RightUp;
  73. }
  74. }
  75. }
  76. }
  77. this.MHookEvent(this, new MHookEventArgs(btnStatus, stMSLL.pt.X, stMSLL.pt.Y));
  78. }
  79. return MouseHook.CallNextHookEx(this.hHook, nCode, wParam, lParam);
  80. }
  81. public bool SetHook()
  82. {
  83. if (this.hHook != IntPtr.Zero)
  84. {
  85. return false;
  86. }
  87. MouseHook.HookProc mouseCallBack = new MouseHook.HookProc(this.MouseHookProcedure);
  88. this.hHook = MouseHook.SetWindowsHookEx(14, mouseCallBack, MouseHook.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
  89. if (this.hHook != IntPtr.Zero)
  90. {
  91. this.gc = GCHandle.Alloc(mouseCallBack);
  92. return true;
  93. }
  94. return false;
  95. }
  96. public bool UnLoadHook()
  97. {
  98. if (this.hHook == IntPtr.Zero)
  99. {
  100. return false;
  101. }
  102. if (MouseHook.UnhookWindowsHookEx(this.hHook))
  103. {
  104. this.hHook = IntPtr.Zero;
  105. this.gc.Free();
  106. return true;
  107. }
  108. return false;
  109. }
  110. }
  111. }