• Win32 键盘鼠标模拟输入


     CInputUtils.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #ifdef _UNICODE
    7. using _tstring = std::wstring;
    8. #else
    9. using _tstring = std::string;
    10. #endif
    11. typedef struct _KBDATA_INFO KBDATA_INFO;
    12. typedef struct _KBDATA_INFO {
    13. WORD vkCode;
    14. WORD scanCode;
    15. DWORD flags;
    16. _KBDATA_INFO() :vkCode(0), scanCode(0), flags(0) {};
    17. _KBDATA_INFO(WORD vk, WORD sc, DWORD f) : vkCode(vk), scanCode(sc), flags(f) {};
    18. _KBDATA_INFO(const _KBDATA_INFO& r) :vkCode(r.vkCode), scanCode(r.scanCode), flags(r.flags) {}
    19. bool operator == (const _KBDATA_INFO& r) const
    20. {
    21. return (this->scanCode == r.scanCode) && (this->flags & 0x01) == (r.flags & 0x01);
    22. }
    23. bool operator != (const _KBDATA_INFO& r) const
    24. {
    25. return !(*this == r);
    26. }
    27. bool operator < (const _KBDATA_INFO& r) const
    28. {
    29. if (this->scanCode != r.scanCode) return this->scanCode < r.scanCode;
    30. return (this->flags & 0x01) < (r.flags & 0x01);
    31. }
    32. void operator=(const _KBDATA_INFO& r)
    33. {
    34. this->vkCode = r.vkCode;
    35. this->scanCode = r.scanCode;
    36. this->flags = r.flags;
    37. }
    38. } KBDATA_INFO, FAR* LPKBDATA_INFO, * PKBDATA_INFO;
    39. class CInputUtils
    40. {
    41. public:
    42. //
    43. // @brief: 发送按键
    44. // @param: wVk 虚键码
    45. // @param: wScan 扫描码
    46. // @param: bExtended 是否扩展键
    47. // @param: bDown 是否要按下
    48. // @param: bUp 是否要弹起
    49. // @param: bScan 是否扫描码(启用后忽略虚键码)
    50. // @ret: bool 操作成功返回true
    51. static bool Keyboard(WORD wVk, WORD wScan, bool bExtended = false, bool bDown = true, bool bUp = true, bool bScan = false);
    52. //
    53. // @brief: 发送按键
    54. // @param: strKey 按键名
    55. // @param: bDown 是否要按下
    56. // @param: bUp 是否要弹起
    57. // @ret: bool 操作成功返回true
    58. static bool Keyboard(_tstring strKey, bool bDown = true, bool bUp = true);
    59. //
    60. // @brief: 发送字符
    61. // @param: ch 字符
    62. // @ret: bool 操作成功返回true
    63. static bool KeyboardChar(TCHAR ch);
    64. //
    65. // @brief: 发送字符串
    66. // @param: strText 字符
    67. // @ret: bool 操作成功返回true
    68. static bool KeyboardText(_tstring strText);
    69. //
    70. // @brief: 鼠标移动
    71. // @param: x 横坐标
    72. // @param: y 纵坐标
    73. // @param: bAbsolute 是否绝对坐标, 如果为true, 移动到指定坐标, 否则相对于当前坐标进行移动
    74. // @ret: bool 操作成功返回true
    75. static bool MouseMove(LONG x, LONG y, bool bAbsolute = true);
    76. //
    77. // @brief: 鼠标按键
    78. // @param: bLeft 鼠标左键
    79. // @param: bRight 鼠标右键
    80. // @param: bMiddle 鼠标中键
    81. // @param: bDown 按下按键
    82. // @param: bUp 弹起按键
    83. // @ret: bool 操作成功返回true
    84. static bool MouseKey(bool bLeft, bool bRight, bool bMiddle, bool bDown = true, bool bUp = true);
    85. //
    86. // @brief: 鼠标滚轮向前滚动
    87. // @param: nSpeed 速度
    88. // @ret: bool 操作成功返回true
    89. static bool MouseWheelForward(LONG nSpeed = 1);
    90. //
    91. // @brief: 鼠标滚轮向后滚动
    92. // @param: nSpeed 速度
    93. // @ret: bool 操作成功返回true
    94. static bool MouseWheelBackward(LONG nSpeed = 1);
    95. private:
    96. static std::map<_tstring, KBDATA_INFO> m_KeyMap;
    97. static std::map m_UsbKeyMap;
    98. };

    CInputUtils.cpp

    1. #include "CInputUtils.h"
    2. #include
    3. std::map<_tstring, KBDATA_INFO> CInputUtils::m_KeyMap =
    4. {
    5. { _T("Esc"), KBDATA_INFO(0x1B, 0x01, 0)},
    6. { _T("F1"), KBDATA_INFO(0x70, 0x3B, 0)},
    7. { _T("F2"), KBDATA_INFO(0x71, 0x3C, 0)},
    8. { _T("F3"), KBDATA_INFO(0x72, 0x3D, 0)},
    9. { _T("F4"), KBDATA_INFO(0x73, 0x3E, 0)},
    10. { _T("F5"), KBDATA_INFO(0x74, 0x3F, 0)},
    11. { _T("F6"), KBDATA_INFO(0x75, 0x40, 0)},
    12. { _T("F7"), KBDATA_INFO(0x76, 0x41, 0)},
    13. { _T("F8"), KBDATA_INFO(0x77, 0x42, 0)},
    14. { _T("F9"), KBDATA_INFO(0x78, 0x43, 0)},
    15. { _T("F10"), KBDATA_INFO(0x79, 0x44, 0)},
    16. { _T("F11"), KBDATA_INFO(0x7A, 0x57, 0)},
    17. { _T("F12"), KBDATA_INFO(0x7B, 0x58, 0)},
    18. { _T("F15"), KBDATA_INFO(0x7E, 0x66, 0)},
    19. { _T("F16"), KBDATA_INFO(0x7F, 0x67, 0)},
    20. { _T("F17"), KBDATA_INFO(0x80, 0x68, 0)},
    21. { _T("`"), KBDATA_INFO(0xC0, 0x29, 0)},
    22. { _T("1"), KBDATA_INFO(0x31, 0x02, 0)},
    23. { _T("2"), KBDATA_INFO(0x32, 0x03, 0)},
    24. { _T("3"), KBDATA_INFO(0x33, 0x04, 0)},
    25. { _T("4"), KBDATA_INFO(0x34, 0x05, 0)},
    26. { _T("5"), KBDATA_INFO(0x35, 0x06, 0)},
    27. { _T("6"), KBDATA_INFO(0x36, 0x07, 0)},
    28. { _T("7"), KBDATA_INFO(0x37, 0x08, 0)},
    29. { _T("8"), KBDATA_INFO(0x38, 0x09, 0)},
    30. { _T("9"), KBDATA_INFO(0x39, 0x0A, 0)},
    31. { _T("0"), KBDATA_INFO(0x30, 0x0B, 0)},
    32. { _T("-"), KBDATA_INFO(0xBD, 0x0C, 0)},
    33. { _T("="), KBDATA_INFO(0xBB, 0x0D, 0)},
    34. { _T("Backspace"), KBDATA_INFO(0x08, 0x0E, 0)},
    35. { _T("LCtrl"), KBDATA_INFO(0xA2, 0x1D, 0)},
    36. { _T("RCtrl"), KBDATA_INFO(0xA3, 0x1D, 1)},
    37. { _T("LAlt"), KBDATA_INFO(0xA4, 0x38, 0)},
    38. { _T("RAlt"), KBDATA_INFO(0xA5, 0x38, 1)},
    39. { _T("LWin"), KBDATA_INFO(0x5B, 0x5B, 1)},
    40. { _T("RWin"), KBDATA_INFO(0x5C, 0x5C, 1)},
    41. { _T("LShift"), KBDATA_INFO(0xA0, 0x2A, 0)},
    42. { _T("RShift"), KBDATA_INFO(0xA1, 0x36, 1)},
    43. { _T("Appcation"), KBDATA_INFO(0x5D, 0x5D, 1)},
    44. { _T("Tab"), KBDATA_INFO(0x09, 0x0F, 0)},
    45. { _T("Space"), KBDATA_INFO(0x20, 0x39, 0)},
    46. { _T("Enter"), KBDATA_INFO(0x0d, 0x1C, 0)},
    47. { _T("["), KBDATA_INFO(0xDB, 0x1A, 0)},
    48. { _T("]"), KBDATA_INFO(0xDD, 0x1B, 0)},
    49. { _T("\\"), KBDATA_INFO(0xDC, 0x2B, 0)},
    50. { _T(";"), KBDATA_INFO(0xBA, 0x27, 0)},
    51. { _T("\'"), KBDATA_INFO(0xDE, 0x28, 0)},
    52. { _T(","), KBDATA_INFO(0xBC, 0x33, 0)},
    53. { _T("."), KBDATA_INFO(0xBE, 0x34, 0)},
    54. { _T("/"), KBDATA_INFO(0xBF, 0x35, 0)},
    55. { _T("A"), KBDATA_INFO('A', 0x1E, 0)},
    56. { _T("B"), KBDATA_INFO('B', 0x30, 0)},
    57. { _T("C"), KBDATA_INFO('C', 0x2E, 0)},
    58. { _T("D"), KBDATA_INFO('D', 0x20, 0)},
    59. { _T("E"), KBDATA_INFO('E', 0x12, 0)},
    60. { _T("F"), KBDATA_INFO('F', 0x21, 0)},
    61. { _T("G"), KBDATA_INFO('G', 0x22, 0)},
    62. { _T("H"), KBDATA_INFO('H', 0x23, 0)},
    63. { _T("I"), KBDATA_INFO('I', 0x17, 0)},
    64. { _T("J"), KBDATA_INFO('J', 0x24, 0)},
    65. { _T("K"), KBDATA_INFO('K', 0x25, 0)},
    66. { _T("L"), KBDATA_INFO('L', 0x26, 0)},
    67. { _T("M"), KBDATA_INFO('M', 0x32, 0)},
    68. { _T("N"), KBDATA_INFO('N', 0x31, 0)},
    69. { _T("O"), KBDATA_INFO('O', 0x18, 0)},
    70. { _T("P"), KBDATA_INFO('P', 0x19, 0)},
    71. { _T("Q"), KBDATA_INFO('Q', 0x10, 0)},
    72. { _T("R"), KBDATA_INFO('R', 0x13, 0)},
    73. { _T("S"), KBDATA_INFO('S', 0x1F, 0)},
    74. { _T("T"), KBDATA_INFO('T', 0x14, 0)},
    75. { _T("U"), KBDATA_INFO('U', 0x16, 0)},
    76. { _T("V"), KBDATA_INFO('V', 0x2F, 0)},
    77. { _T("W"), KBDATA_INFO('W', 0x11, 0)},
    78. { _T("X"), KBDATA_INFO('X', 0x2D, 0)},
    79. { _T("Y"), KBDATA_INFO('Y', 0x15, 0)},
    80. { _T("Z"), KBDATA_INFO('Z', 0x2C, 0)},
    81. { _T("Up"), KBDATA_INFO(0x26, 0x48, 1)},
    82. { _T("Down"), KBDATA_INFO(0x28, 0x50, 1)},
    83. { _T("Left"), KBDATA_INFO(0x25, 0x4B, 1)},
    84. { _T("Right"), KBDATA_INFO(0x27, 0x4D, 1)},
    85. { _T("Num Up"), KBDATA_INFO(0x26, 0x48, 0)},
    86. { _T("Num Down"), KBDATA_INFO(0x28, 0x50, 0)},
    87. { _T("Num Left"), KBDATA_INFO(0x25, 0x4B, 0)},
    88. { _T("Num Right"), KBDATA_INFO(0x27, 0x4D, 0)},
    89. { _T("Insert"), KBDATA_INFO(0x2d, 0x52, 1)},
    90. { _T("Home"), KBDATA_INFO(0x24, 0x47, 1)},
    91. { _T("Page Up"), KBDATA_INFO(0x21, 0x49, 1)},
    92. { _T("Delete"), KBDATA_INFO(0x2E, 0x53, 1) },
    93. { _T("End"), KBDATA_INFO(0x23, 0x4F, 1)},
    94. { _T("Page Down"), KBDATA_INFO(0x22, 0x51, 1)},
    95. { _T("Prnt Scrn"), KBDATA_INFO(0x2C, 0x37, 1)},
    96. { _T("Scroll Lock"), KBDATA_INFO(0x91, 0x46, 0)},
    97. { _T("Num Lock"), KBDATA_INFO(0x90, 0x45, 1)},
    98. { _T("Caps Lock"), KBDATA_INFO(0x14, 0x3A, 0) },
    99. { _T("Pause"), KBDATA_INFO(0x13, 0x45, 1)},
    100. { _T("Num 0"), KBDATA_INFO(0x60, 0x52, 0) },
    101. { _T("Num 1"), KBDATA_INFO(0x61, 0x4F, 0) },
    102. { _T("Num 2"), KBDATA_INFO(0x62, 0x50, 0) },
    103. { _T("Num 3"), KBDATA_INFO(0x63, 0x51, 0) },
    104. { _T("Num 4"), KBDATA_INFO(0x64, 0x4B, 0) },
    105. { _T("Num 5"), KBDATA_INFO(0x65, 0x4C, 0) },
    106. { _T("Num 6"), KBDATA_INFO(0x66, 0x4D, 0) },
    107. { _T("Num 7"), KBDATA_INFO(0x67, 0x47, 0) },
    108. { _T("Num 8"), KBDATA_INFO(0x68, 0x48, 0) },
    109. { _T("Num 9"), KBDATA_INFO(0x69, 0x49, 0) },
    110. { _T("Num Home"), KBDATA_INFO(0x24, 0x47, 0) },
    111. { _T("Num End"), KBDATA_INFO(0x23, 0x4F, 0) },
    112. { _T("Num Page Up"), KBDATA_INFO(0x21, 0x49, 0) },
    113. { _T("Num Page Down"), KBDATA_INFO(0x22, 0x51, 0) },
    114. { _T("Clear"), KBDATA_INFO(0x0C, 0x4C, 0) },
    115. { _T("Num /"), KBDATA_INFO(0x6f, 0x35, 1) },
    116. { _T("Num *"), KBDATA_INFO(0x6A, 0x37, 0) },
    117. { _T("Num -"), KBDATA_INFO(0x6D, 0x4A, 0) },
    118. { _T("Num +"), KBDATA_INFO(0x6B, 0x4E, 0) },
    119. { _T("Num Enter"), KBDATA_INFO(0x0B, 0x1C, 1) },
    120. { _T("Num Del"), KBDATA_INFO(0x2E, 0x53, 0) },
    121. { _T("Num Insert"), KBDATA_INFO(0x2D, 0x52, 0) },
    122. { _T("Num ."), KBDATA_INFO(0x6E, 0x53, 0) },
    123. }; //118个按键
    124. //USB按键映射表
    125. std::map CInputUtils::m_UsbKeyMap =
    126. {
    127. {0x04, _T("A")},
    128. {0x05, _T("B")},
    129. {0x06, _T("C")},
    130. {0x07, _T("D")},
    131. {0x08, _T("E")},
    132. {0x09, _T("F")},
    133. {0x0A, _T("G")},
    134. {0x0B, _T("H")},
    135. {0x0C, _T("I")},
    136. {0x0D, _T("J")},
    137. {0x0E, _T("K")},
    138. {0x0F, _T("L")},
    139. {0x10, _T("M")},
    140. {0x11, _T("N")},
    141. {0x12, _T("O")},
    142. {0x13, _T("P")},
    143. {0x14, _T("Q")},
    144. {0x15, _T("R")},
    145. {0x16, _T("S")},
    146. {0x17, _T("T")},
    147. {0x18, _T("U")},
    148. {0x19, _T("V")},
    149. {0x1A, _T("W")},
    150. {0x1B, _T("X")},
    151. {0x1C, _T("Y")},
    152. {0x1D, _T("Z")},
    153. {0x1E, _T("1")},
    154. {0x1F, _T("2")},
    155. {0x20, _T("3")},
    156. {0x21, _T("4")},
    157. {0x22, _T("5")},
    158. {0x23, _T("6")},
    159. {0x24, _T("7")},
    160. {0x25, _T("8")},
    161. {0x26, _T("9")},
    162. {0x27, _T("0")},
    163. {0x28, _T("Enter")},
    164. {0x29, _T("Esc")},
    165. {0x2A, _T("Backspace")},
    166. {0x2B, _T("Tab")},
    167. {0x2C, _T("Space")},
    168. {0x2D, _T("-")},
    169. {0x2E, _T("=")},
    170. {0x2F, _T("[")},
    171. {0x30, _T("]")},
    172. {0x31, _T("\\")},
    173. {0x33, _T(";")},
    174. {0x34, _T("\'")},
    175. {0x35, _T("`")},
    176. {0x36, _T(",")},
    177. {0x37, _T(".")},
    178. {0x38, _T("/")},
    179. {0x39, _T("Caps Lock")},
    180. {0x3A, _T("F1")},
    181. {0x3B, _T("F2")},
    182. {0x3C, _T("F3")},
    183. {0x3D, _T("F4")},
    184. {0x3E, _T("F5")},
    185. {0x3F, _T("F6")},
    186. {0x40, _T("F7")},
    187. {0x41, _T("F8")},
    188. {0x42, _T("F9")},
    189. {0x43, _T("F10")},
    190. {0x44, _T("F11")},
    191. {0x45, _T("F12")},
    192. {0x46, _T("Prnt Scrn")},
    193. {0x47, _T("Scroll Lock")},
    194. {0x48, _T("Pause")},
    195. {0x49, _T("Insert")},
    196. {0x4A, _T("Home")},
    197. {0x4B, _T("Page Up")},
    198. {0x4C, _T("Delete")},
    199. {0x4D, _T("End")},
    200. {0x4E, _T("Page Down")},
    201. {0x4F, _T("Right")},
    202. {0x50, _T("Left")},
    203. {0x51, _T("Down")},
    204. {0x52, _T("Up")},
    205. {0x53, _T("Num Lock")},
    206. {0x54, _T("Num /")},
    207. {0x55, _T("Num *")},
    208. {0x56, _T("Num -")},
    209. {0x57, _T("Num +")},
    210. {0x58, _T("Num Enter")},
    211. {0x59, _T("Num 1")},
    212. {0x5A, _T("Num 2")},
    213. {0x5B, _T("Num 3")},
    214. {0x5C, _T("Num 4")},
    215. {0x5D, _T("Num 5")},
    216. {0x5E, _T("Num 6")},
    217. {0x5F, _T("Num 7")},
    218. {0x60, _T("Num 8")},
    219. {0x61, _T("Num 9")},
    220. {0x62, _T("Num 0")},
    221. {0x63, _T("Num .")},
    222. {0x64, _T("\\(Non-US)")},
    223. {0x65, _T("Appcation")}
    224. };
    225. bool CInputUtils::Keyboard(WORD wVk, WORD wScan, bool bExtended/* = false*/, bool bDown/* = true*/, bool bUp/* = true*/, bool bScan/* = false*/)
    226. {
    227. INPUT inputs[0x02] = { 0 };
    228. UINT uSnedCount = 0;
    229. DWORD dwFlag = 0;
    230. if (bExtended) dwFlag |= KEYEVENTF_EXTENDEDKEY;
    231. if (bScan) dwFlag |= KEYEVENTF_SCANCODE;
    232. if (bDown)
    233. {
    234. inputs[uSnedCount].type = INPUT_KEYBOARD;
    235. inputs[uSnedCount].ki.wVk = wVk;
    236. inputs[uSnedCount].ki.wScan = wScan;
    237. inputs[uSnedCount].ki.dwFlags = dwFlag;
    238. uSnedCount++;
    239. }
    240. if (bUp)
    241. {
    242. inputs[uSnedCount].type = INPUT_KEYBOARD;
    243. inputs[uSnedCount].ki.wVk = wVk;
    244. inputs[uSnedCount].ki.wScan = wScan;
    245. inputs[uSnedCount].ki.dwFlags = dwFlag | KEYEVENTF_KEYUP;
    246. uSnedCount++;
    247. }
    248. UINT uCount = ::SendInput(uSnedCount, inputs, sizeof(INPUT));
    249. return uSnedCount == uCount;
    250. }
    251. bool CInputUtils::Keyboard(_tstring strKey, bool bDown/* = true*/, bool bUp/* = true*/)
    252. {
    253. bool bFind = false;
    254. KBDATA_INFO keyData;
    255. for (const auto& item : m_KeyMap)
    256. {
    257. if (0 == _tcsicmp(item.first.c_str(), strKey.c_str()))
    258. {
    259. keyData = item.second;
    260. bFind = true;
    261. }
    262. }
    263. if (!bFind)
    264. {
    265. return false;
    266. }
    267. INPUT inputs[0x02] = { 0 };
    268. UINT uSnedCount = 0;
    269. if (bDown)
    270. {
    271. inputs[uSnedCount].type = INPUT_KEYBOARD;
    272. inputs[uSnedCount].ki.wVk = keyData.vkCode;
    273. inputs[uSnedCount].ki.wScan = keyData.scanCode;
    274. inputs[uSnedCount].ki.dwFlags = keyData.flags;
    275. uSnedCount++;
    276. }
    277. if (bUp)
    278. {
    279. inputs[uSnedCount].type = INPUT_KEYBOARD;
    280. inputs[uSnedCount].ki.wVk = keyData.vkCode;
    281. inputs[uSnedCount].ki.wScan = keyData.scanCode;
    282. inputs[uSnedCount].ki.dwFlags = keyData.flags | KEYEVENTF_KEYUP;
    283. uSnedCount++;
    284. }
    285. UINT uCount = ::SendInput(uSnedCount, inputs, sizeof(INPUT));
    286. return uSnedCount == uCount;
    287. }
    288. bool CInputUtils::KeyboardChar(TCHAR ch)
    289. {
    290. INPUT inputs[0x01] = { 0 };
    291. inputs[0].type = INPUT_KEYBOARD;
    292. inputs[0].ki.wVk = 0;
    293. inputs[0].ki.wScan = ch;
    294. inputs[0].ki.dwFlags = KEYEVENTF_UNICODE;
    295. UINT uCount = ::SendInput(1, inputs, sizeof(INPUT));
    296. return 1 == uCount;
    297. }
    298. bool CInputUtils::KeyboardText(_tstring strText)
    299. {
    300. INPUT inputs[0x01] = { 0 };
    301. inputs[0].type = INPUT_KEYBOARD;
    302. inputs[0].ki.wVk = 0;
    303. inputs[0].ki.dwFlags = KEYEVENTF_UNICODE;
    304. UINT uCount = 0;
    305. for (const auto& item : strText)
    306. {
    307. inputs[0].ki.wScan = item;
    308. uCount = ::SendInput(1, inputs, sizeof(INPUT));
    309. }
    310. return 1 == uCount;
    311. }
    312. bool CInputUtils::MouseMove(LONG x, LONG y, bool bAbsolute)
    313. {
    314. LONG dwWidth = ::GetSystemMetrics(SM_CXSCREEN);
    315. LONG dwHeight = ::GetSystemMetrics(SM_CYSCREEN);
    316. INPUT inputs[0x01] = { 0 };
    317. inputs[0].type = INPUT_MOUSE;
    318. if (bAbsolute)
    319. {
    320. inputs[0].mi.dx = (LONG)((double)65535 / (double)dwWidth * x);
    321. inputs[0].mi.dy = (LONG)((double)65535 / (double)dwHeight * y);
    322. }
    323. else
    324. {
    325. inputs[0].mi.dx = x;
    326. inputs[0].mi.dy = y;
    327. }
    328. inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
    329. if (bAbsolute)
    330. {
    331. inputs[0].mi.dwFlags |= MOUSEEVENTF_ABSOLUTE;
    332. }
    333. UINT uCount = ::SendInput(1, inputs, sizeof(INPUT));
    334. return 1 == uCount;
    335. }
    336. bool CInputUtils::MouseKey(bool bLeft, bool bRight, bool bMiddle, bool bDown/* = true*/, bool bUp/* = true*/)
    337. {
    338. INPUT inputs[0x06] = { 0 };
    339. UINT uSendCount = 0;
    340. if (bLeft)
    341. {
    342. if (bDown)
    343. {
    344. inputs[uSendCount].type = INPUT_MOUSE;
    345. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    346. uSendCount++;
    347. }
    348. if (bUp)
    349. {
    350. inputs[uSendCount].type = INPUT_MOUSE;
    351. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    352. uSendCount++;
    353. }
    354. }
    355. if (bRight)
    356. {
    357. if (bDown)
    358. {
    359. inputs[uSendCount].type = INPUT_MOUSE;
    360. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
    361. uSendCount++;
    362. }
    363. if (bUp)
    364. {
    365. inputs[uSendCount].type = INPUT_MOUSE;
    366. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_RIGHTUP;
    367. uSendCount++;
    368. }
    369. }
    370. if (bMiddle)
    371. {
    372. if (bDown)
    373. {
    374. inputs[uSendCount].type = INPUT_MOUSE;
    375. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
    376. uSendCount++;
    377. }
    378. if (bUp)
    379. {
    380. inputs[uSendCount].type = INPUT_MOUSE;
    381. inputs[uSendCount].mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
    382. uSendCount++;
    383. }
    384. }
    385. UINT uCount = ::SendInput(uSendCount, inputs, sizeof(INPUT));
    386. return uSendCount == uCount;
    387. }
    388. bool CInputUtils::MouseWheelForward(LONG nSpeed/* = 1*/)
    389. {
    390. INPUT inputs[0x01] = { 0 };
    391. inputs[0].type = INPUT_MOUSE;
    392. inputs[0].mi.dwFlags = MOUSEEVENTF_WHEEL;
    393. inputs[0].mi.mouseData = WHEEL_DELTA * nSpeed;
    394. UINT uCount = ::SendInput(1, inputs, sizeof(INPUT));
    395. return 1 == uCount;
    396. }
    397. bool CInputUtils::MouseWheelBackward(LONG nSpeed/* = 1*/)
    398. {
    399. INPUT inputs[0x01] = { 0 };
    400. inputs[0].type = INPUT_MOUSE;
    401. inputs[0].mi.dwFlags = MOUSEEVENTF_WHEEL;
    402. inputs[0].mi.mouseData = 0 - (WHEEL_DELTA * nSpeed);
    403. UINT uCount = ::SendInput(1, inputs, sizeof(INPUT));
    404. return 1 == uCount;
    405. }

     

     

  • 相关阅读:
    K8s 之 ReadinessProbe(就绪探针)使用的迷惑
    Reggie外卖项目 —— 公共字段自动填充功能
    【Nginx】# 负载均衡配置(容灾)
    【分享课】腾讯云大讲堂TDSQL(PG版)OSS平台管理-周四晚19:30
    Recursion Function 递归和栈的笔记
    项目质量管理
    云堡垒机和软件堡垒机哪个好?区别是什么?
    Vue2+element-ui配置Register和404页面
    Elasticsearch学习系列一(部署和配置IK分词器)
    基于SpringBoot的设备管理系统
  • 原文地址:https://blog.csdn.net/Flame_Cyclone/article/details/133162010