模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage
转自模拟键盘输入
: SendMessage, keybd_event, PostKeybdMessage
目的
最近项目要求在Windows CE下模拟键盘输入,上网搜索了一下,发现有3个API可以用:SendMessage,keybd_event,PostKeybdMessage。
分析
1. SendMessage
(1) 模拟输入字符 - ANSI
::SendMessage(hWnd, WM_CHAR, 'a', 0);
(2) 模拟输入字符 - Unicode
::SendMessage(hWnd, WM_CHAR, L'我', 0)
疑问:用SendMessage是直接向目标窗口发消息,很怀疑它是不是真的在“模拟”。
2. keybd_event
这个API的定义可以在这里找到:http://msdn.microsoft.com/en-us/library/aa453245.aspx
(1) 模拟输入字符 - ANSI
::keybd_event(0x41, 0, 0, 0);
::keybd_event(0x41, 0, KEYEVENTF_KEYUP, 0);
(2) 模拟输入字符 - Unicode
keybd_event的定义说,第一个参数bVk的取值范围只能是[1, 254],而且Windows CE下的keybd_event并不支持KEYEVENTF_UNICODE,而且我也没办法试出用keybd_event输入Unicode字符的方法。
(3) 模拟输入命令
::keybd_event(VK_LCONTROL, 0, 0, 0);
::keybd_event(0x56, 0, 0, 0);
::keybd_event(0x56, 0, KEYEVENTF_KEYUP, 0);
::keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
3. PostKeybdMessage
这个API的定义可以在这里找到:http://msdn.microsoft.com/en-us/library/ms911936.aspx
(1) 模拟输入字符

PostKeybdMessage
INT nBufferLength = ::wcslen(lpszBuffer);
UINT* lpStateFlags = new UINT[nBufferLength];
UINT* lpTextBuffer = new UINT[nBufferLength];
for (INT nIndex = 0; nIndex < nBufferLength; nIndex++)
{
lpStateFlags[nIndex] = KeyStateDownFlag;
lpTextBuffer[nIndex] = (UINT)lpszBuffer[nIndex];
}
::PostKeybdMessage(hWnd, 0, lpStateFlags[0], nLength, lpStateFlags, lpTextBuffer);
delete [] lpStateFlags;
delete [] lpTextBuffer;

总结
个人认为
1. 当需要模拟键盘输入命令时,比如Ctrl + V,选择keybd_event;
2. 当需要模拟键盘输入一串字符时,选择PostKeybdMessage;
3. 当需要模拟键盘输入单个字符时,选择keybd_event。
资料:
1. Virtual-Key Codes: http://msdn.microsoft.com/en-us/library/ms927178.aspx
模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage的更多相关文章
- 模拟键盘输入首先要用到一个API函数:keybd_event
转自:http://www.cnblogs.com/cpcpc/archive/2011/02/22/2123055.html 模拟键盘输入首先要用到一个API函数:keybd_event. 模拟按键 ...
- C# keybd_event用法 模拟键盘输入
最近有业务需求,需要模拟键盘输入,所以了解了一下C#中keybd_event函数的用法.该函数能够产生WM_KEYUP或WM_KEYDOWN消息,即可以触发键盘事件. 函数引用如下: [DllImpo ...
- VB模拟键盘输入的N种方法
VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...
- VC 模拟键盘输入
转载请注明来源:https://www.cnblogs.com/hookjc/ vc模拟键盘输入keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('M', 0, 0 ...
- 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示
1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...
- 远程控制篇:用Delphi模拟键盘输入/鼠标点击
模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数. Keybd_event函数能触发一个按键事件,也就是会产生一个WM_KEYDOWN或WM_KEYUP消息 ...
- Python模拟键盘输入和鼠标操作
Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0) #c ...
- 用Delphi模拟键盘输入
在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的操作,我们能否通过编制程序来代替手工输入, ...
- SendInput模拟键盘输入的问题
SendInput模拟键盘输入的问题 http://www.cnblogs.com/yedaoq/archive/2010/12/30/1922305.html 最近接触到这个函数,因此了解了一下, ...
随机推荐
- Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例
1. 复制指定目录下指定后缀名的文件并修改名称的案例 需求:复制指定目录下的指定文件,并修改后缀名. • 指定的文件是:.java文件. • 指定的后缀名是:.jad • 指 ...
- Clean Code(二):函数
笔记2:函数1.短小.还要更短小 每个函数都一目了然,每个函数灰依序把你带到下一个函数 if.else.while语句等,其中的代码块应该只有一行,块内调用的函数名称应该较具有说明性2.只 ...
- JVM笔记6:JVM类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析.初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制 从类被加载到虚拟机内存中开始,到卸载出内存为止 ...
- Mac下sublime text 的“package control”安装
小伙伴们好,我根据昨晚的经历写一个小总结:关于“Mac下sublime text 的“package control”安装”.本来安装package control是一个无比简单的事情,即使是初次使用 ...
- html-01
1.HTML:超文本标记语言,由浏览器解析成页面.html文件是以.html或者 .htm 2.HTML的作用 |- 控制页面的外观. |- 发布帮助文档 3.常见的浏览器 |-IE:微 ...
- jBPM开发入门指南
http://blog.csdn.net/eric474470/article/details/7665265 工作流虽然还在不成熟的发展阶段,甚至还没有一个公认的规范标准.但其应用却已经在快速展开, ...
- primefaces 带参数的组件
分析了一下primefaces extension showcase的源码,总结一下组件传参的方式. 下面定义了一个组件,名为fourTabsDecoratorCustom.xhtml 1: < ...
- 游标、type使用示例
declare my_cur sys_refcursor; --定义游标变量 type v_record is record( --定义 record类型 obj_id number, ...
- jfinal不能正确加载html网页,总是报错的解决方法
今天自学jfinal,遇到一个很奇怪的问题,render("/index.html");总是报错. 仔细看错误日志,才发现原来是因为html网页放到了WEB-INF文件夹下面了,所 ...
- ZOJ 1091 (HDU 1372) Knight Moves(BFS)
Knight Moves Time Limit: 2 Seconds Memory Limit: 65536 KB A friend of you is doing research on ...