MouseAssist.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #include "stdafx.h"
  2. #include "MouseAssist.h"
  3. MouseAssist::MouseAssist()
  4. {
  5. _hWnd = NULL;
  6. _nMode = -1;
  7. _curpt = {0,0};
  8. }
  9. MouseAssist::~MouseAssist()
  10. {
  11. _hWnd = NULL;
  12. _nMode = -1;
  13. }
  14. void MouseAssist::BindWnd(HWND hWnd, int nMode)
  15. {
  16. _hWnd = hWnd;
  17. _nMode = nMode;
  18. }
  19. void MouseAssist::UnBindWnd()
  20. {
  21. _hWnd = NULL;
  22. _nMode = -1;
  23. }
  24. BOOL MouseAssist::GetCursorPos()
  25. {
  26. BOOL bRet = ::GetCursorPos(&_curpt);
  27. if (_nMode == PT_TYPE::WINDOW_POINT) {
  28. // 窗口句柄判断;
  29. if (_hWnd) {
  30. bRet = ScreenToClient(_hWnd, &_curpt);
  31. if (!bRet)
  32. OutputDebugString("坐标转窗口失败\n");
  33. }
  34. }
  35. return bRet;
  36. }
  37. BOOL MouseAssist::GetCursorPos(long& x, long& y)
  38. {
  39. BOOL bRet = GetCursorPos();
  40. x = _curpt.x;
  41. y = _curpt.y;
  42. return bRet;
  43. }
  44. BOOL MouseAssist::SetCursorPos(long x, long y)
  45. {
  46. _curpt = {x, y};
  47. return ::SetCursorPos(x, y);
  48. }
  49. BOOL MouseAssist::MoveTo(int x, int y)
  50. {
  51. _curpt = {x, y};
  52. BOOL bRet = FALSE;
  53. if ( _nMode == PT_TYPE::SCREEN_POINT) {
  54. if ( _hWnd )
  55. ::ClientToScreen(_hWnd, &_curpt);
  56. #if 0 // mouse_event处理
  57. ::SetCursorPos(_curpt.x, _curpt.y);
  58. // MOUSEEVENTF_ABSOLUTE 使用绝对鼠标位置;
  59. mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, _curpt.x, _curpt.y, 0, 0);
  60. #else // setinput处理;
  61. static long fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;
  62. static long fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;
  63. double fx = (double)_curpt.x * (65535.0f / fScreenWidth);
  64. double fy = (double)_curpt.y * (65535.0f / fScreenHeight);
  65. INPUT Input = { 0 };
  66. Input.type = INPUT_MOUSE;
  67. Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
  68. Input.mi.dx = static_cast<LONG>(fx);
  69. Input.mi.dy = static_cast<LONG>(fy);
  70. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  71. #endif
  72. }
  73. else if ( _nMode == PT_TYPE::WINDOW_POINT ) {
  74. // 有时PostMessage才生效;
  75. bRet = ::PostMessage(_hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
  76. }
  77. return bRet;
  78. }
  79. BOOL MouseAssist::MoveToEx(int x, int y, int w, int h)
  80. {
  81. if (w >= 2 && h >= 2)
  82. return MoveTo(x + rand() % w, y + rand() % h);
  83. else
  84. return MoveTo(x, y);
  85. }
  86. BOOL MouseAssist::LeftClick()
  87. {
  88. BOOL bDown = FALSE;
  89. BOOL bUp = FALSE;
  90. if ( _nMode == PT_TYPE::SCREEN_POINT ) {
  91. INPUT Input = { 0 };
  92. Input.type = INPUT_MOUSE;
  93. Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
  94. bDown = ::SendInput(1, &Input, sizeof(INPUT));
  95. ::ZeroMemory(&Input, sizeof(INPUT));
  96. Input.type = INPUT_MOUSE;
  97. Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
  98. bUp = ::SendInput(1, &Input, sizeof(INPUT));
  99. }
  100. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  101. //bDown = ::SendMessageTimeout(_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  102. //bUp = ::SendMessageTimeout(_hWnd, WM_LBUTTONUP, 0, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  103. bDown = ::PostMessage(_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  104. ::PostMessage(_hWnd, WM_NCHITTEST, 0, MAKELPARAM(_curpt.x, _curpt.y));
  105. ::PostMessage(_hWnd, WM_NCHITTEST, HTCLIENT, 0);
  106. bUp = ::PostMessage(_hWnd, WM_LBUTTONUP, 0, MAKELPARAM(_curpt.x, _curpt.y));
  107. }
  108. return bDown & bUp;
  109. }
  110. BOOL MouseAssist::LeftDoubleClick()
  111. {
  112. BOOL bDown = LeftClick();
  113. ::Sleep(1);
  114. BOOL bUp = LeftClick();
  115. return bDown & bUp;
  116. }
  117. BOOL MouseAssist::LeftDown()
  118. {
  119. BOOL bRet = FALSE;
  120. if ( _nMode == PT_TYPE::SCREEN_POINT ) {
  121. #if 0
  122. ::SetCursorPos(_curpt.x, _curpt.y);
  123. mouse_event(MOUSEEVENTF_LEFTDOWN, _curpt.x, _curpt.y, 0, 0);
  124. #else
  125. INPUT Input = { 0 };
  126. Input.type = INPUT_MOUSE;
  127. Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
  128. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  129. #endif
  130. }
  131. else if ( _nMode == PT_TYPE::WINDOW_POINT ) {
  132. bRet = ::PostMessage(_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  133. }
  134. return bRet;
  135. }
  136. BOOL MouseAssist::LeftUp()
  137. {
  138. BOOL bRet = FALSE;
  139. if (_nMode == PT_TYPE::SCREEN_POINT) {
  140. #if 0
  141. ::SetCursorPos(_curpt.x, _curpt.y);
  142. mouse_event(MOUSEEVENTF_LEFTUP, _curpt.x, _curpt.y, 0, 0);
  143. #else
  144. INPUT Input = { 0 };
  145. Input.type = INPUT_MOUSE;
  146. Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
  147. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  148. #endif
  149. }
  150. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  151. bRet = ::PostMessage(_hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  152. }
  153. return bRet;
  154. }
  155. BOOL MouseAssist::MiddleClick()
  156. {
  157. BOOL bDown = FALSE;
  158. BOOL bUp = FALSE;
  159. if (_nMode == PT_TYPE::SCREEN_POINT) {
  160. INPUT Input = { 0 };
  161. Input.type = INPUT_MOUSE;
  162. Input.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
  163. bDown = ::SendInput(1, &Input, sizeof(INPUT));
  164. ::ZeroMemory(&Input, sizeof(INPUT));
  165. Input.type = INPUT_MOUSE;
  166. Input.mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
  167. bUp = ::SendInput(1, &Input, sizeof(INPUT));
  168. }
  169. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  170. bDown = ::SendMessageTimeout(_hWnd, WM_MBUTTONDOWN, MK_MBUTTON, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  171. bUp = ::SendMessageTimeout(_hWnd, WM_MBUTTONUP, MK_MBUTTON, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  172. }
  173. return bDown & bUp;
  174. }
  175. BOOL MouseAssist::MiddleDown()
  176. {
  177. BOOL bRet = FALSE;
  178. if (_nMode == PT_TYPE::SCREEN_POINT) {
  179. INPUT Input = { 0 };
  180. Input.type = INPUT_MOUSE;
  181. Input.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
  182. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  183. }
  184. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  185. bRet = ::PostMessage(_hWnd, WM_MBUTTONDOWN, MK_MBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  186. }
  187. return bRet;
  188. }
  189. BOOL MouseAssist::MiddleUp()
  190. {
  191. BOOL bRet = FALSE;
  192. if (_nMode == PT_TYPE::SCREEN_POINT) {
  193. INPUT Input = { 0 };
  194. Input.type = INPUT_MOUSE;
  195. Input.mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
  196. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  197. }
  198. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  199. bRet = ::PostMessage(_hWnd, WM_MBUTTONUP, MK_MBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  200. }
  201. return bRet;
  202. }
  203. BOOL MouseAssist::RightClick()
  204. {
  205. BOOL bDown = FALSE;
  206. BOOL bUp = FALSE;
  207. if (_nMode == PT_TYPE::SCREEN_POINT) {
  208. INPUT Input = { 0 };
  209. Input.type = INPUT_MOUSE;
  210. Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  211. bDown = ::SendInput(1, &Input, sizeof(INPUT));
  212. ::ZeroMemory(&Input, sizeof(INPUT));
  213. Input.type = INPUT_MOUSE;
  214. Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  215. bUp = ::SendInput(1, &Input, sizeof(INPUT));
  216. }
  217. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  218. bDown = ::SendMessageTimeout(_hWnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  219. bUp = ::SendMessageTimeout(_hWnd, WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(_curpt.x, _curpt.y), SMTO_BLOCK, 2000, nullptr);
  220. }
  221. return bDown & bUp;
  222. }
  223. BOOL MouseAssist::RightDown()
  224. {
  225. BOOL bRet = FALSE;
  226. if (_nMode == PT_TYPE::SCREEN_POINT) {
  227. #if 0
  228. ::SetCursorPos(_curpt.x, _curpt.y);
  229. mouse_event(MOUSEEVENTF_RIGHTDOWN, _curpt.x, _curpt.y, 0, 0);
  230. #else
  231. INPUT Input = { 0 };
  232. Input.type = INPUT_MOUSE;
  233. Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  234. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  235. #endif
  236. }
  237. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  238. bRet = ::PostMessage(_hWnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  239. }
  240. return bRet;
  241. }
  242. BOOL MouseAssist::RightUp()
  243. {
  244. BOOL bRet = FALSE;
  245. if (_nMode == PT_TYPE::SCREEN_POINT) {
  246. #if 0
  247. ::SetCursorPos(_curpt.x, _curpt.y);
  248. mouse_event(MOUSEEVENTF_RIGHTUP, _curpt.x, _curpt.y, 0, 0);
  249. #else
  250. INPUT Input = { 0 };
  251. Input.type = INPUT_MOUSE;
  252. Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  253. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  254. #endif
  255. }
  256. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  257. bRet = ::PostMessage(_hWnd, WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(_curpt.x, _curpt.y));
  258. }
  259. return bRet;
  260. }
  261. BOOL MouseAssist::WheelDown()
  262. {
  263. BOOL bRet = FALSE;
  264. if (_nMode == PT_TYPE::SCREEN_POINT) {
  265. #if 0
  266. ::SetCursorPos(_curpt.x, _curpt.y);
  267. mouse_event(MOUSEEVENTF_RIGHTUP, _curpt.x, _curpt.y, 0, 0);
  268. #else
  269. INPUT Input = { 0 };
  270. Input.type = INPUT_MOUSE;
  271. Input.mi.dwFlags = MOUSEEVENTF_WHEEL;
  272. Input.mi.mouseData = WHEEL_DELTA;
  273. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  274. #endif
  275. }
  276. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  277. bRet = ::PostMessage(_hWnd, WM_MOUSEWHEEL, MAKEWPARAM(-WHEEL_DELTA, 0), MAKELPARAM(_curpt.x, _curpt.y));
  278. }
  279. return bRet;
  280. }
  281. BOOL MouseAssist::WheelUp()
  282. {
  283. BOOL bRet = FALSE;
  284. if (_nMode == PT_TYPE::SCREEN_POINT) {
  285. #if 0
  286. ::SetCursorPos(_curpt.x, _curpt.y);
  287. mouse_event(MOUSEEVENTF_RIGHTUP, _curpt.x, _curpt.y, 0, 0);
  288. #else
  289. INPUT Input = { 0 };
  290. Input.type = INPUT_MOUSE;
  291. Input.mi.dwFlags = MOUSEEVENTF_WHEEL;
  292. Input.mi.mouseData = -WHEEL_DELTA;
  293. bRet = ::SendInput(1, &Input, sizeof(INPUT));
  294. #endif
  295. }
  296. else if (_nMode == PT_TYPE::WINDOW_POINT) {
  297. bRet = ::PostMessage(_hWnd, WM_MOUSEWHEEL, MAKEWPARAM(WHEEL_DELTA, 0), MAKELPARAM(_curpt.x, _curpt.y));
  298. }
  299. return bRet;
  300. }