MyKeyboardNamespace.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. 本源码由TC简单软件科技有限公司开源,功能可以自由修改、发布、
  3. 长沙简单软件科技有限公司对于源码不做后期维护,,请大家在使用过程中遵循开源协议
  4. */
  5. ///////////////////////////////////////
  6. #include "stdafx.h"
  7. #include "MyKeyboardNamespace.h"
  8. #include <windows.h>
  9. #include <process.h>
  10. #include <stdio.h>
  11. #include <conio.h>
  12. /*===================================================================
  13. 构造函数
  14. ====================================================================*/
  15. MyKeyboardNamespace::MyKeyboardNamespace(void)
  16. {
  17. delaytime = 40;
  18. }
  19. /*===================================================================
  20. 析构函数
  21. ====================================================================*/
  22. MyKeyboardNamespace::~MyKeyboardNamespace(void)
  23. {
  24. }
  25. /*===================================================================
  26. 函数名称 : keyPressDown
  27. 功能描述 : 键盘按下弹起
  28. 返回值: 返回值:BOOL类型
  29. _TRUE表示成功,_FALSE表示失败
  30. 参数:
  31. 名称 类型 描述
  32. -----------------------------------------------
  33. list MyDataList * 键盘按下弹起什么键以及键盘按下弹起具体的次数
  34. ret _variant_t * 接收返回值传出去
  35. 修改历史 :
  36. 修改者 日期 描述
  37. 邓媛元 2010-07-18
  38. 邓媛元 2010-07-20 检测
  39. ====================================================================*/
  40. bool MyKeyboardNamespace::keyPress(DWORD keycode)
  41. {
  42. unsigned char bkeydown = keycode;
  43. keybd_event(bkeydown, MapVirtualKey(bkeydown, 0), 0, 0);
  44. ::Sleep(delaytime);
  45. //2011-11-02 修改按键延时,有人反应按键太慢
  46. keybd_event(bkeydown, MapVirtualKey(bkeydown, 0), KEYEVENTF_KEYUP, 0);
  47. //*ret = true;
  48. return true;
  49. }
  50. /*===================================================================
  51. 函数名称 : keyDown
  52. 功能描述 : 键盘按下
  53. 返回值: 返回值:BOOL类型
  54. _TRUE表示成功,_FALSE表示失败
  55. 参数:
  56. 名称 类型 描述
  57. -----------------------------------------------
  58. list MyDataList * 键盘按下什么键以及键盘按下具体的次数
  59. ret _variant_t * 接收返回值传出去
  60. 修改历史 :
  61. 修改者 日期 描述
  62. 邓媛元 2010-07-18
  63. 邓媛元 2010-07-20 检测
  64. ====================================================================*/
  65. bool MyKeyboardNamespace::keyDown(DWORD keycode)
  66. {
  67. unsigned char bkeydown = keycode;
  68. keybd_event(bkeydown, MapVirtualKey(bkeydown, 0), 0, 0);
  69. return true;
  70. }
  71. /*===================================================================
  72. 函数名称 : keyUp
  73. 功能描述 : 键盘松开
  74. 返回值: 返回值:BOOL类型
  75. _TRUE表示成功,_FALSE表示失败
  76. 参数:
  77. 名称 类型 描述
  78. -----------------------------------------------
  79. list MyDataList * 键盘弹起什么键以及键盘弹起的具体次数
  80. ret _variant_t * 接收返回值传出去
  81. 修改历史 :
  82. 修改者 日期 描述
  83. 邓媛元 2010-07-18
  84. 邓媛元 2010-07-20 检测
  85. ====================================================================*/
  86. bool MyKeyboardNamespace::keyUp(DWORD keycode)
  87. {
  88. unsigned char bkeydown = keycode;
  89. keybd_event(bkeydown, MapVirtualKey(bkeydown, 0), KEYEVENTF_KEYUP, 0);//放开键 
  90. return true;
  91. }
  92. /*===================================================================
  93. 函数名称 : sendkeyString
  94. 功能描述 : 模拟键盘发送字符串
  95. 返回值: 返回值:BOOL类型
  96. _TRUE表示成功,_FALSE表示失败
  97. 参数:
  98. 名称 类型 描述
  99. -----------------------------------------------
  100. list MyDataList * 传进来键盘按下的字符串
  101. ret _variant_t * 接收返回值传出去
  102. 修改历史 :
  103. 修改者 日期 描述
  104. 邓媛元 2010-07-18
  105. 邓媛元 2010-07-20 检测
  106. ====================================================================*/
  107. bool MyKeyboardNamespace::sendkeyString(wchar_t* strs, DWORD delays)
  108. {
  109. int length = wcslen(strs);
  110. for (int i = 0; i < length; ++i)
  111. {
  112. INPUT keyin;
  113. keyin.type = INPUT_KEYBOARD;
  114. keyin.ki.wVk = 0;
  115. keyin.ki.wScan = strs[i];
  116. keyin.ki.time = 100;
  117. keyin.ki.dwFlags = KEYEVENTF_UNICODE;
  118. keyin.ki.dwExtraInfo = GetMessageExtraInfo();
  119. ::SendInput(1, &keyin, sizeof(INPUT));
  120. Sleep(delays);
  121. }
  122. return true;
  123. }
  124. BYTE keyCode[127] = { VK_BACK,VK_TAB,VK_CLEAR,VK_RETURN,VK_SHIFT,VK_CONTROL,VK_MENU,VK_PAUSE,VK_CAPITAL,VK_KANA, //10
  125. VK_JUNJA,VK_FINAL,VK_HANJA,VK_KANJI,VK_ESCAPE,VK_CONVERT,VK_NONCONVERT,VK_ACCEPT,VK_MODECHANGE,VK_SPACE, //10
  126. VK_PRIOR,VK_NEXT,VK_END,VK_HOME,VK_LEFT,VK_UP,VK_RIGHT,VK_DOWN,VK_SELECT,VK_PRINT, //10
  127. VK_EXECUTE,VK_SNAPSHOT,VK_INSERT,VK_DELETE,VK_HELP, //5
  128. '0','1','2','3','4','5','6','7','8','9', //10
  129. 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', //26
  130. VK_LWIN,VK_RWIN,VK_APPS,VK_SLEEP,VK_NUMPAD0,VK_NUMPAD1,VK_NUMPAD2,VK_NUMPAD3,VK_NUMPAD4,VK_NUMPAD5, //10
  131. VK_NUMPAD6,VK_NUMPAD7,VK_NUMPAD8,VK_NUMPAD9,VK_MULTIPLY,VK_ADD,VK_SEPARATOR,VK_SUBTRACT,VK_DECIMAL,VK_DIVIDE, //10
  132. VK_F1,VK_F2,VK_F3,VK_F4,VK_F5,VK_F6,VK_F7,VK_F8,VK_F9,VK_F10,VK_F11,VK_F12, //12
  133. VK_NUMLOCK,VK_SCROLL,VK_OEM_NEC_EQUAL,VK_LSHIFT,VK_RSHIFT,VK_LCONTROL,VK_RCONTROL,VK_LMENU,VK_RMENU,VK_OEM_1, //10
  134. VK_OEM_PLUS,VK_OEM_COMMA,VK_OEM_MINUS,VK_OEM_PERIOD,VK_OEM_2,VK_OEM_3,VK_OEM_4,VK_OEM_5,VK_OEM_6,VK_OEM_7, //10
  135. VK_OEM_8,VK_OEM_AX,VK_OEM_102
  136. };
  137. /*===================================================================
  138. 函数名称 : waitkeypress
  139. 功能描述 : 暂停程序等待任意按键后继续
  140. 返回值: 返回值:BOOL类型
  141. _TRUE表示成功,_FALSE表示失败
  142. 参数:
  143. 名称 类型 描述
  144. -----------------------------------------------
  145. list MyDataList * 传进来键盘按下的字符串
  146. ret _variant_t * 接收返回值传出去
  147. 修改历史 :
  148. 修改者 日期 描述
  149. 邓媛元 2010-07-18
  150. 邓媛元 2010-07-20 检测
  151. ====================================================================*/
  152. bool MyKeyboardNamespace::waitkeypress(DWORD keycode, DWORD delay)
  153. {
  154. MSG msg;
  155. int waittime = 0;
  156. if (delay > 0)
  157. waittime = delay;
  158. int time1 = ::GetTickCount();
  159. while (true)
  160. {
  161. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  162. {
  163. if (WM_QUIT == msg.message)
  164. break;
  165. TranslateMessage(&msg);
  166. DispatchMessage(&msg);
  167. }
  168. else
  169. {
  170. if (keycode == 0)
  171. {
  172. for (int i = 0; i < 127; i++)
  173. {
  174. if (0x8000 & GetAsyncKeyState(keyCode[i]))
  175. {
  176. return true;
  177. }
  178. }
  179. }
  180. else
  181. {
  182. if (0x8000 & GetAsyncKeyState(keycode))
  183. {
  184. return true;
  185. }
  186. }
  187. if (waittime > 0)
  188. {
  189. if ((::GetTickCount() - time1) >= waittime)
  190. return false;
  191. }
  192. }
  193. ::Sleep(5);
  194. }
  195. return false;
  196. }