Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

219 rindas
8.2 KiB

  1. // This code is distributed under MIT license.
  2. // Copyright (c) 2015 George Mamaladze
  3. // See license.txt or https://mit-license.org/
  4. using System;
  5. using System.Runtime.InteropServices;
  6. using System.Windows.Forms;
  7. using Gma.System.MouseKeyHook.WinApi;
  8. namespace Gma.System.MouseKeyHook
  9. {
  10. /// <summary>
  11. /// Provides extended data for the MouseClickExt and MouseMoveExt events.
  12. /// </summary>
  13. public class MouseEventExtArgs : MouseEventArgs
  14. {
  15. /// <summary>
  16. /// Initializes a new instance of the <see cref="MouseEventExtArgs" /> class.
  17. /// </summary>
  18. /// <param name="buttons">One of the MouseButtons values indicating which mouse button was pressed.</param>
  19. /// <param name="clicks">The number of times a mouse button was pressed.</param>
  20. /// <param name="point">The x and y coordinate of a mouse click, in pixels.</param>
  21. /// <param name="delta">A signed count of the number of detents the wheel has rotated.</param>
  22. /// <param name="timestamp">The system tick count when the event occurred.</param>
  23. /// <param name="isMouseButtonDown">True if event signals mouse button down.</param>
  24. /// <param name="isMouseButtonUp">True if event signals mouse button up.</param>
  25. /// <param name="isHorizontalWheel">True if event signals horizontal wheel action.</param>
  26. internal MouseEventExtArgs(MouseButtons buttons, int clicks, Point point, int delta, int timestamp,
  27. bool isMouseButtonDown, bool isMouseButtonUp, bool isHorizontalWheel)
  28. : base(buttons, clicks, point.X, point.Y, delta)
  29. {
  30. IsMouseButtonDown = isMouseButtonDown;
  31. IsMouseButtonUp = isMouseButtonUp;
  32. IsHorizontalWheel = isHorizontalWheel;
  33. Timestamp = timestamp;
  34. }
  35. /// <summary>
  36. /// Set this property to <b>true</b> inside your event handler to prevent further processing of the event in other
  37. /// applications.
  38. /// </summary>
  39. public bool Handled { get; set; }
  40. /// <summary>
  41. /// True if event contains information about wheel scroll.
  42. /// </summary>
  43. public bool WheelScrolled
  44. {
  45. get { return Delta != 0; }
  46. }
  47. /// <summary>
  48. /// True if event signals a click. False if it was only a move or wheel scroll.
  49. /// </summary>
  50. public bool Clicked
  51. {
  52. get { return Clicks > 0; }
  53. }
  54. /// <summary>
  55. /// True if event signals mouse button down.
  56. /// </summary>
  57. public bool IsMouseButtonDown { get; }
  58. /// <summary>
  59. /// True if event signals mouse button up.
  60. /// </summary>
  61. public bool IsMouseButtonUp { get; }
  62. /// <summary>
  63. /// True if event signals horizontal wheel action.
  64. /// </summary>
  65. public bool IsHorizontalWheel { get; }
  66. /// <summary>
  67. /// The system tick count of when the event occurred.
  68. /// </summary>
  69. public int Timestamp { get; }
  70. /// <summary>
  71. /// </summary>
  72. internal Point Point
  73. {
  74. get { return new Point(X, Y); }
  75. }
  76. internal static MouseEventExtArgs FromRawDataApp(CallbackData data)
  77. {
  78. var wParam = data.WParam;
  79. var lParam = data.LParam;
  80. var marshalledMouseStruct =
  81. (AppMouseStruct) Marshal.PtrToStructure(lParam, typeof(AppMouseStruct));
  82. return FromRawDataUniversal(wParam, marshalledMouseStruct.ToMouseStruct());
  83. }
  84. internal static MouseEventExtArgs FromRawDataGlobal(CallbackData data)
  85. {
  86. var wParam = data.WParam;
  87. var lParam = data.LParam;
  88. var marshalledMouseStruct = (MouseStruct) Marshal.PtrToStructure(lParam, typeof(MouseStruct));
  89. return FromRawDataUniversal(wParam, marshalledMouseStruct);
  90. }
  91. /// <summary>
  92. /// Creates <see cref="MouseEventExtArgs" /> from relevant mouse data.
  93. /// </summary>
  94. /// <param name="wParam">First Windows Message parameter.</param>
  95. /// <param name="mouseInfo">A MouseStruct containing information from which to construct MouseEventExtArgs.</param>
  96. /// <returns>A new MouseEventExtArgs object.</returns>
  97. private static MouseEventExtArgs FromRawDataUniversal(IntPtr wParam, MouseStruct mouseInfo)
  98. {
  99. var button = MouseButtons.None;
  100. short mouseDelta = 0;
  101. var clickCount = 0;
  102. var isMouseButtonDown = false;
  103. var isMouseButtonUp = false;
  104. var isHorizontalWheel = false;
  105. switch ((long) wParam)
  106. {
  107. case Messages.WM_LBUTTONDOWN:
  108. isMouseButtonDown = true;
  109. button = MouseButtons.Left;
  110. clickCount = 1;
  111. break;
  112. case Messages.WM_LBUTTONUP:
  113. isMouseButtonUp = true;
  114. button = MouseButtons.Left;
  115. clickCount = 1;
  116. break;
  117. case Messages.WM_LBUTTONDBLCLK:
  118. isMouseButtonDown = true;
  119. button = MouseButtons.Left;
  120. clickCount = 2;
  121. break;
  122. case Messages.WM_RBUTTONDOWN:
  123. isMouseButtonDown = true;
  124. button = MouseButtons.Right;
  125. clickCount = 1;
  126. break;
  127. case Messages.WM_RBUTTONUP:
  128. isMouseButtonUp = true;
  129. button = MouseButtons.Right;
  130. clickCount = 1;
  131. break;
  132. case Messages.WM_RBUTTONDBLCLK:
  133. isMouseButtonDown = true;
  134. button = MouseButtons.Right;
  135. clickCount = 2;
  136. break;
  137. case Messages.WM_MBUTTONDOWN:
  138. isMouseButtonDown = true;
  139. button = MouseButtons.Middle;
  140. clickCount = 1;
  141. break;
  142. case Messages.WM_MBUTTONUP:
  143. isMouseButtonUp = true;
  144. button = MouseButtons.Middle;
  145. clickCount = 1;
  146. break;
  147. case Messages.WM_MBUTTONDBLCLK:
  148. isMouseButtonDown = true;
  149. button = MouseButtons.Middle;
  150. clickCount = 2;
  151. break;
  152. case Messages.WM_MOUSEWHEEL:
  153. isHorizontalWheel = false;
  154. mouseDelta = mouseInfo.MouseData;
  155. break;
  156. case Messages.WM_MOUSEHWHEEL:
  157. isHorizontalWheel = true;
  158. mouseDelta = mouseInfo.MouseData;
  159. break;
  160. case Messages.WM_XBUTTONDOWN:
  161. button = mouseInfo.MouseData == 1
  162. ? MouseButtons.XButton1
  163. : MouseButtons.XButton2;
  164. isMouseButtonDown = true;
  165. clickCount = 1;
  166. break;
  167. case Messages.WM_XBUTTONUP:
  168. button = mouseInfo.MouseData == 1
  169. ? MouseButtons.XButton1
  170. : MouseButtons.XButton2;
  171. isMouseButtonUp = true;
  172. clickCount = 1;
  173. break;
  174. case Messages.WM_XBUTTONDBLCLK:
  175. isMouseButtonDown = true;
  176. button = mouseInfo.MouseData == 1
  177. ? MouseButtons.XButton1
  178. : MouseButtons.XButton2;
  179. clickCount = 2;
  180. break;
  181. }
  182. var e = new MouseEventExtArgs(
  183. button,
  184. clickCount,
  185. mouseInfo.Point,
  186. mouseDelta,
  187. mouseInfo.Timestamp,
  188. isMouseButtonDown,
  189. isMouseButtonUp,
  190. isHorizontalWheel);
  191. return e;
  192. }
  193. internal MouseEventExtArgs ToDoubleClickEventArgs()
  194. {
  195. return new MouseEventExtArgs(Button, 2, Point, Delta, Timestamp, IsMouseButtonDown, IsMouseButtonUp, IsHorizontalWheel);
  196. }
  197. }
  198. }