转自模拟键盘输入
: SendMessage, keybd_event, PostKeybdMessage

目的

  最近项目要求在Windows CE下模拟键盘输入,上网搜索了一下,发现有3个API可以用:SendMessage,keybd_event,PostKeybdMessage。

  分析

  1. SendMessage

  (1) 模拟输入字符 - ANSI

// Input a 'a'

::SendMessage(hWnd, WM_CHAR, 'a', 0);

  (2) 模拟输入字符 - Unicode

// Input a '我'

::SendMessage(hWnd, WM_CHAR, L'我', 0)

  疑问:用SendMessage是直接向目标窗口发消息,很怀疑它是不是真的在“模拟”。

  2. keybd_event

  这个API的定义可以在这里找到:http://msdn.microsoft.com/en-us/library/aa453245.aspx

  (1) 模拟输入字符 - ANSI

// Input a 'a'

::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) 模拟输入命令

// Paste - Ctrl + V

::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

LPWSTR lpszBuffer = L"我是iVincentFeng";

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的更多相关文章

  1. 模拟键盘输入首先要用到一个API函数:keybd_event

    转自:http://www.cnblogs.com/cpcpc/archive/2011/02/22/2123055.html 模拟键盘输入首先要用到一个API函数:keybd_event. 模拟按键 ...

  2. C# keybd_event用法 模拟键盘输入

    最近有业务需求,需要模拟键盘输入,所以了解了一下C#中keybd_event函数的用法.该函数能够产生WM_KEYUP或WM_KEYDOWN消息,即可以触发键盘事件. 函数引用如下: [DllImpo ...

  3. VB模拟键盘输入的N种方法

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

  4. VC 模拟键盘输入

    转载请注明来源:https://www.cnblogs.com/hookjc/ vc模拟键盘输入keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('M', 0, 0 ...

  5. 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示

    1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...

  6. 远程控制篇:用Delphi模拟键盘输入/鼠标点击

    模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数. Keybd_event函数能触发一个按键事件,也就是会产生一个WM_KEYDOWN或WM_KEYUP消息 ...

  7. Python模拟键盘输入和鼠标操作

    Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0)  #c ...

  8. 用Delphi模拟键盘输入

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的操作,我们能否通过编制程序来代替手工输入, ...

  9. SendInput模拟键盘输入的问题

    SendInput模拟键盘输入的问题  http://www.cnblogs.com/yedaoq/archive/2010/12/30/1922305.html 最近接触到这个函数,因此了解了一下, ...

随机推荐

  1. arcmap10如果判断一个面是否含洞

    使用字段计算器,使用python !Shape.isMultipart!结果为true就是,false不是

  2. c语言入门经典必背18个程序

    1 . /* 输出 9*9 口诀.共 9 行 9 列, i 控制行, j 控制列. */ #include "stdio.h" main() {int i,j,result; fo ...

  3. LUN 和 LVM 知识

    LUN是对存储设备而言的,volume是对主机而言的. lun是指硬件层分出的逻辑盘,如raid卡可以将做好的400G的raid5再分成若干个逻辑盘,以便于使用,每一个逻辑盘对应一个lun号,OS层仍 ...

  4. redhat 6.4 双网卡绑定

    linux系统配置 1.redhat 6.4 双网卡绑定 1)#ethtool eth* //在服务器网口接网线至笔记本,确定各网口的配置文件: 2)切换目录 #cd /etc/sysconfig/n ...

  5. Redis与Memcached对比

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富,有字符串.链表.集合和有序集合.支持在服务器端计算集合的并,交和补集等.还支持多 ...

  6. Linux基础1之磁盘与分区

    Linux上面设备皆文件,目前需要知道的,比如U盘和SARA硬盘的在Linux上面的文件名,/dev/sd[a-p].与IDE接口不同的是,SATA/USB接口的磁盘没有一定的顺序,这里就根据Linu ...

  7. 总结一下const和readonly

    const和readonly的值一旦初始化则都不再可以改写: const只能在声明时初始化:readonly既可以在声明时初始化也可以在构造器中初始化: const隐含static,不可以再写stat ...

  8. 深入理解Java的接口和抽象类 _摘抄

    http://www.cnblogs.com/dolphin0520/p/3811437.html 原文 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可 ...

  9. 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)

    MVC 1. 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...

  10. WPF动画之关键帧动画(2)

    XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...