MouseHook.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Forms;
  9. namespace GeekDesk.Util
  10. {
  11. public class MouseHook
  12. {
  13. private Point point;
  14. private Point Point
  15. {
  16. get { return point; }
  17. set
  18. {
  19. if (point != value)
  20. {
  21. point = value;
  22. if (MouseMoveEvent != null)
  23. {
  24. var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0);
  25. MouseMoveEvent(this, e);
  26. }
  27. }
  28. }
  29. }
  30. private int hHook;
  31. private const int WM_MOUSEMOVE = 0x200;
  32. private const int WM_LBUTTONDOWN = 0x201;
  33. private const int WM_RBUTTONDOWN = 0x204;
  34. private const int WM_MBUTTONDOWN = 0x207;
  35. private const int WM_LBUTTONUP = 0x202;
  36. private const int WM_RBUTTONUP = 0x205;
  37. private const int WM_MBUTTONUP = 0x208;
  38. private const int WM_LBUTTONDBLCLK = 0x203;
  39. private const int WM_RBUTTONDBLCLK = 0x206;
  40. private const int WM_MBUTTONDBLCLK = 0x209;
  41. public const int WH_MOUSE_LL = 14;
  42. public Win32Api.HookProc hProc;
  43. public MouseHook()
  44. {
  45. this.Point = new Point();
  46. }
  47. public int SetHook()
  48. {
  49. hProc = new Win32Api.HookProc(MouseHookProc);
  50. hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);
  51. return hHook;
  52. }
  53. public void UnHook()
  54. {
  55. Win32Api.UnhookWindowsHookEx(hHook);
  56. }
  57. private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
  58. {
  59. Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));
  60. if (nCode < 0)
  61. {
  62. return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
  63. }
  64. else
  65. {
  66. if (MouseClickEvent != null)
  67. {
  68. MouseButtons button = MouseButtons.None;
  69. int clickCount = 0;
  70. switch ((Int32)wParam)
  71. {
  72. case WM_LBUTTONDOWN:
  73. button = MouseButtons.Left;
  74. clickCount = 1;
  75. MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  76. break;
  77. case WM_RBUTTONDOWN:
  78. button = MouseButtons.Right;
  79. clickCount = 1;
  80. MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  81. break;
  82. case WM_MBUTTONDOWN:
  83. button = MouseButtons.Middle;
  84. clickCount = 1;
  85. MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  86. break;
  87. case WM_LBUTTONUP:
  88. button = MouseButtons.Left;
  89. clickCount = 1;
  90. MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  91. break;
  92. case WM_RBUTTONUP:
  93. button = MouseButtons.Right;
  94. clickCount = 1;
  95. MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  96. break;
  97. case WM_MBUTTONUP:
  98. button = MouseButtons.Middle;
  99. clickCount = 1;
  100. MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0));
  101. break;
  102. }
  103. var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);
  104. MouseClickEvent(this, e);
  105. }
  106. this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);
  107. return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
  108. }
  109. }
  110. public delegate void MouseMoveHandler(object sender, MouseEventArgs e);
  111. public event MouseMoveHandler MouseMoveEvent;
  112. public delegate void MouseClickHandler(object sender, MouseEventArgs e);
  113. public event MouseClickHandler MouseClickEvent;
  114. public delegate void MouseDownHandler(object sender, MouseEventArgs e);
  115. public event MouseDownHandler MouseDownEvent;
  116. public delegate void MouseUpHandler(object sender, MouseEventArgs e);
  117. public event MouseUpHandler MouseUpEvent;
  118. public class Win32Api
  119. {
  120. [StructLayout(LayoutKind.Sequential)]
  121. public class POINT
  122. {
  123. public int x;
  124. public int y;
  125. }
  126. [StructLayout(LayoutKind.Sequential)]
  127. public class MouseHookStruct
  128. {
  129. public POINT pt;
  130. public int hwnd;
  131. public int wHitTestCode;
  132. public int dwExtraInfo;
  133. }
  134. public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  135. [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  136. public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
  137. [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  138. public static extern bool UnhookWindowsHookEx(int idHook);
  139. [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  140. public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
  141. }
  142. }
  143. }