最近闲着没事,就随意浏览博客,突然发现了一种模拟键盘输入的办法(之前一直想破脑袋的都没有想到的),然后借此机会说明一下。

具体实现方法

1)借用粘贴板
这是比较容易想到的,也最受程序员鄙视的一种办法,如果你实在想不到好的办法,用这种方法救救急还是可以的,具体代码可以参照MSDN。(当然,此法有一个好处,不用处理英文和中文的区别,直接无脑复制过去即可)

2)利用SendInput来模拟
这种就是模拟输入法输入的过程,需要处理中文编码的问题(本人对于编码不是太在行,所以就不多做解释了,直接看代码吧)

#include <iostream>
#include <windows.h>
#include <string>using namespace std;std::wstring stringToWstring(const std::string& str)
{LPCSTR pszSrc = str.c_str();int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0);if (nLen == 0)return std::wstring(L"");wchar_t* pwszDst = new wchar_t[nLen];if (!pwszDst)return std::wstring(L"");MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);std::wstring wstr(pwszDst);delete[] pwszDst;pwszDst = NULL;return wstr;
}void SendAscii(wchar_t data, BOOL shift)
{INPUT input[2];memset(input, 0, 2 * sizeof(INPUT));if (shift){input[0].type = INPUT_KEYBOARD;input[0].ki.wVk = VK_SHIFT;SendInput(1, input, sizeof(INPUT));}input[0].type = INPUT_KEYBOARD;input[0].ki.wVk = data;input[1].type = INPUT_KEYBOARD;input[1].ki.wVk = data;input[1].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(2, input, sizeof(INPUT));if (shift){input[0].type = INPUT_KEYBOARD;input[0].ki.wVk = VK_SHIFT;input[0].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(1, input, sizeof(INPUT));}
}void SendUnicode(wchar_t data)
{INPUT input[2];memset(input, 0, 2 * sizeof(INPUT));input[0].type = INPUT_KEYBOARD;input[0].ki.wVk = 0;input[0].ki.wScan = data;input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE;SendInput(1, &input[0], sizeof(INPUT));input[1].type = INPUT_KEYBOARD;input[1].ki.wVk = 0;input[1].ki.wScan = data;input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE;  这里是为了防止英文字符进入到系统输入法里面,则可以解决国内的输入法软件拦截的问题,但是国外的软件一般做了UNICODE兼容,所以还是会有问题。SendInput(1, &input[1], sizeof(INPUT));
}void SendKeys(string msg)
{short vk;BOOL shift;wstring data = stringToWstring(msg);int len = data.size();for (int i = 0; i<len; i++){if (data[i] >= 0 && data[i]<256) //ascii字符{vk = VkKeyScanW(data[i]);if (vk == -1){SendUnicode(data[i]);}else{if (vk < 0){vk = ~vk + 0x1;}shift = vk >> 8 & 0x1;if (GetKeyState(VK_CAPITAL) & 0x1){if (data[i] >= 'a' && data[i] <= 'z' || data[i] >= 'A' && data[i] <= 'Z'){shift = !shift;}}SendAscii(vk & 0xFF, shift);}}else //unicode字符{SendUnicode(data[i]);}}
}void main()
{Sleep(5000);//如果你是在UTF8的环境下使用,字符串要转成GBK格式的,否则必乱码SendKeys("我爱北京天安门");
}//这里只是先说一下sendinput的作用,至于处理的步骤,就不说了,我也不大懂。
//还有一点。某些输入法会拦截sendinput,然后就变成了输入法弹出一个候选词条框,

3)借用keybd_event 据说已经不用了
这玩意只能处理英文,不能处理中文,但是博主在测试过程中没有发现输入法会拦截英文字符的现象,可以考虑和上面的那个函数合并。

void SendAscii(wchar_t data, BOOL shift)
{if (shift){keybd_event(VK_SHIFT, 0, 0, 0);}keybd_event(data, 0, 0, 0);keybd_event(data, 0, KEYEVENTF_KEYUP, 0);if (shift){keybd_event(VK_SHIFT, 0, 0, 0);}
}//理论上来说,这里应该也会拦截,keybd_event的下层还是用sendinput实现的,可能博主的环境有点不一样吧,详细的还需要自己测试一下。

Win下模拟键盘输入的三种办法相关推荐

  1. java中像scanf一样多个输入_VB模拟键盘输入的N种方法

    VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...

  2. java中从键盘输入的三种方法以及Console输入

    java中从键盘输入的三种方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

  3. Java 键盘输入的三种方法

    Java 键盘输入的三种方法 1.System.in和System.out方法:从控制台接收一个字符,然后将其打印出来 虽然此方式实现了从键盘获取输入的字符,但是System.out.read()只能 ...

  4. java 获取键盘输入法_Java中接收键盘输入的三种方法

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. php虚拟键盘输入,[问题] bash下如何模拟键盘输入

    你的位置: 问答吧 -> Shell -> 问题详情 [问题] bash下如何模拟键盘输入 我想要在bash下模拟键盘输入. 现在有两个实例. 1. 如果我在使用未配置sudo nopas ...

  6. Python——实现网页模拟键盘输入和鼠标点击

    Python--实现网页模拟键盘输入和鼠标点击 一.安装selenium库 1.1 win+R打开输入窗口 1.2 输入cmd,点击确定 1.3 输入代码: 二.以谷歌浏览器为例,配置环境 2.1打开 ...

  7. 模拟键盘输入的keycode

    今天有个弹出框的element一直找不到,换了种方法关掉,就是用模拟键盘输入,找到以下对应的keycode,先记录下来,说不定以后用得上/*--------------------edit by 20 ...

  8. JavaScript - 模拟键盘输入支付密码

    JavaScript - 模拟键盘输入支付密码 Max.Bai 2016-12-29 0x00: 发生了什么事 我做自动化测试的时候,需要自动化在页面上输入这个密码,什么样子的,看下面: 有没有很像支 ...

  9. Python win32api.keybd_event模拟键盘输入

    Python  win32api.keybd_event模拟键盘输入 win32api.keybd_event 该函数原型:keybd_event(bVk, bScan, dwFlags, dwExt ...

最新文章

  1. ios unrecognized selector sent to instance出现的原因和解决方案
  2. 我的世界java刷怪数量_我的世界Minecraft源码分析(1):刷怪逻辑
  3. 自助餐比喻秒懂微服务
  4. php 利用redis写一个聊天室,Redis实现多人多聊天室功能
  5. vue项目使用eslint
  6. 动态定时任务数据库获取方式
  7. Android 开发笔记 一
  8. 测试集没标签,可以拿来测模型吗?
  9. HTML+CSS+JS实现 ❤️等离子球体ui动画特效❤️
  10. java执行指定目录的class文件
  11. Oracle数据的导出与导入
  12. 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址
  13. hdu acm1157
  14. seaborn关联图表之折线图和散点图
  15. dw注册页面html,在 Dreamweaver 中生成注册页 - Dreamweaver 用户指南
  16. 【C语言初级】 在有序数组中在折半查找数值并打印下标
  17. Spring-Boot Liveness 和 Readness 接口使用
  18. 支付宝支付,当面付二维码支付
  19. 键盘按键VK键值列表及宏定义
  20. (附源码)计算机毕业设计SSM裕民镇养老院信息管理系统

热门文章

  1. minty_Brit666‘s python practice no.2
  2. Adobe.* 绿色版
  3. csol永恒python多少钱_新手Python程序员上手Linux
  4. 用matlab将灰度图转换为彩色图
  5. 创客板Arduino之LED控制暗到明 明到暗
  6. linux vim查看下一页,Linux下vi和vim模式相互切换
  7. 华为荣耀3x畅玩版解锁教程(一键操作)
  8. 路德第五季在线观看迅雷下载
  9. 【游戏开发实战】手把手教你在Windows上通过WSL运行Skynet,不用安装虚拟机,方便快捷(WSL | Linux | Ubuntu | Skynet | VSCode)
  10. 微信小程序中Map地图组件的使用