不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 121|回复: 0

[c/c++] C/C++使用keybd_event模拟键盘按键

[复制链接]
BiaoGe 发表于 2018-7-24 02:03:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 BiaoGe 于 2018-7-24 02:05 编辑
  1. #include <stdio.h>
  2. #include <Windows.h>

  3. /*
  4.         设置键盘大小写状态
  5.         big:为TRUE则切换大写状态,否则切换小写状态
  6. */
  7. VOID MySetKeyBig(BOOL big = FALSE);

  8. /*
  9.         模拟键盘按键,支持大小写
  10.         str:需要按出的字符串
  11. */
  12. VOID MyAnalogKey(char *str);

  13. int main(void)
  14. {
  15.         // 当程序运行1.5s时再执行模拟按键,以便选择需要操作的窗口
  16.         Sleep(1500);
  17.         MyAnalogKey("Love life,Love BiaoGe.0123456789");
  18.         system("pause");
  19.         return 0;
  20. }

  21. VOID MySetKeyBig(BOOL big)
  22. {
  23.         // 判断键盘CapsLock键是否开启状态,开启状态则为大写,否则为小写
  24.         if (GetKeyState(VK_CAPITAL))
  25.         {
  26.                 // 如果当前键盘状态为大写,要求改小写,则模拟按键CapsLock切换状态
  27.                 if (!big)
  28.                 {
  29.                         keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  30.                         keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  31.                 }
  32.         }
  33.         else
  34.         {
  35.                 // 如果当前键盘状态为小写,要求改大写,则模拟按键CapsLock切换状态
  36.                 if (big)
  37.                 {
  38.                         keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  39.                         keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  40.                 }
  41.         }
  42. }

  43. VOID MyAnalogKey(char *str)
  44. {
  45.         int iLen = 0;
  46.         char *tmp = NULL;
  47.         INPUT *keys = NULL;
  48.         BOOL bOldState = FALSE;

  49.         // 保存此操作前的键盘状态
  50.         bOldState = (BOOL)GetKeyState(VK_CAPITAL);
  51.         iLen = lstrlen(str);
  52.         tmp = (char *)malloc(iLen);
  53.         memmove(tmp, str, iLen);
  54.         for (int i = 0; i < iLen; i++)
  55.         {
  56.                 // 某些符号非直属键盘按键,这里只过滤转换两个,以后用到其它字符自行添加过滤
  57.                 if (tmp[i] == ' ')
  58.                 {
  59.                         // 产生一个击键消息步骤:按下->抬起
  60.                         keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  61.                         keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  62.                 }
  63.                 else if (tmp[i] == ',')
  64.                 {
  65.                         keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  66.                         keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  67.                 }
  68.                 else if (tmp[i] >= 'a' && tmp[i] <= 'z')
  69.                 { // 根据字符大小写切换键盘大小写状态
  70.                         MySetKeyBig(0);
  71.                         // keybd_event只识别大写
  72.                         keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  73.                         keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  74.                 }
  75.                 else if ((tmp[i] >= 'A' && tmp[i] <= 'Z') || (tmp[i] >= '0' && tmp[i] <= '9'))
  76.                 {
  77.                         MySetKeyBig(1);
  78.                         keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  79.                         keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  80.                 }
  81.                 else
  82.                 {
  83.                         keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);
  84.                         keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
  85.                 }
  86.         }
  87.         // 恢复此操作之前的键盘状态
  88.         MySetKeyBig(bOldState);
  89.         free(tmp);
  90. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-8-18 10:42

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表