WinSDK-键盘消息
一 参考url
http://www.cnblogs.com/5iedu/p/4656178.html
http://blog.csdn.net/yiyefangzhou24/article/details/6632416
二 实验环境
win7 x86_64
vs2015 update1
debugview v4.81
三 测试目标
WM_KEYUP, WM_KEYDOWN, WM_CHAR, WM_DEADCHAR与函数TranslateMessage的关系
四 测试步骤
<1> 编写一个接收键盘消息的窗口程序(以下只显示关键代码)
1 窗口消息队列处理循环

2 消息回调函数

3 四种消息解析函数

4 打印函数

<2> 测试步骤
1 按下a键-->抬起a键

可以看到translate在down跟up消息之间插入了一条WM_CHAR消息, wp存放的值是a
2 按下CapsLk(大小写锁定键)-->抬起这个键 -->按下a键-->抬起a键

可以看到translate在 a键的WM_KEYDOWN 与WM_KEYUP之间插入了一条WM_CHAR消息, wp存放的值是A
3 添加德语输入法, 切换到德语键盘 依次执行 =键按下-->=键抬起-->a键按下-->a键抬起(就是输入德语字母á的操作)


可以看到translate在=键按下与抬起之间插入了一条WM_DEADCHAR消息, 然后在a键WM_KEYDOWN 与WM_KEYUP之间插入了一条WM_CHAR消息, wp存放的值是á
4 延伸测试(测试搜狗输入法原理的原理)
<1>开启搜狗输入法的中文输入模式, 依次执行 a键按下-->a键抬起-->1键按下-->1键抬起(就是输入中文"啊"的操作)

可以看到a键的WM_CHAR消息没有打印, 1键WM_DOWN之后发送的应该是"啊"的WM_CHAR消息
<2>修改代码, 把translatemsg那条语句注释掉, 在重复<1>的操作, 发现输入法根本没有执行相应的输入动作
根据文中开头的引用url里面的说法,结合试验结果, 得出以下结论:
开启搜狗输入法后, dispatchMessage将消息首先发送给搜狗输入法, 输入法只处理WM_CHAR消息, 其余的继续传递给下一个消息处理函数也就是文章开头的窗口回调函数, 当接收到一条WM_CHAR消息后得到一个或者一个汉字时, 就会使用postmessage发送一个WM_CHAR消息, wp参数的值就是汉字的当前字符集的编码值
五 结论
1 translateMessage会根据按键的WM_KEYDOWN消息,VM_KEYUP消息的组合产生WM_CHAR或者WM_DEADCHAR消息, 插入的位置是在WM_DOWN之后
2 搜狗输入法的输入原理是截获WM_CHAR消息, 根据自身输入法的规则产生输入的字符, 然后以WM_CHAR消息发送给目标窗口
WinSDK-键盘消息的更多相关文章
- VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...
- 使用PreTranslateMessage替代钩子函数处理键盘消息
2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...
- 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息
键盘消息 Windows系统无论何时只有一个窗口(可能是子窗口,也就是控件)能获得焦点. 焦点窗口通过windows消息来响应人的键盘操作,与键盘相关的常用消息罗列如下: WM_KEYDOWN 按 ...
- keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z
首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...
- mfc对话框不能响应键盘消息
这东西真是奇怪,找了半天原因,最终的发现却是让人抓狂,呵呵 现象:对话框按ESC或回车都不能关闭窗口(我没有处理PreTransplanteMessage),用spy++看,对话框完全收不到键盘消息 ...
- TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...
- MFC控件编程之鼠标跟键盘消息
MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...
- 简单全局HOOK拦截大部分键盘消息
前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...
- 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...
- C++模拟键盘消息
实现功能:在现有DLL程序中向特定的EXE窗口中发送模拟键盘的消息 使用API根据窗口标题递归查找特定的窗口句柄,之后模拟调用. 注意:keybd_event函数不能在VS下使用,所以用SendInp ...
随机推荐
- CSS组合设计输入框和按钮生成自定义关键字查询栏
效果图: html代码: <!DOCTYPE html> <head> <title></title> </head> <body&g ...
- Python第十课学习
Python第十课学习 www.cnblogs.com/yuanchenqi/articles/5828233.html 函数: 1 减少代码的重复 2 更易扩展,弹性更强:便于日后文件功能的修改 3 ...
- 1个多商户、多平台版 微信小程序(多商户、多平台版),影城行业、影业连锁 多商户、多平台版微信小程序。(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本)
1个 影城行业 微信小程序(多商户.多平台版), 影业连锁 多商户.多平台版微信小程序.(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本) 资讯QQ: 876635409 ...
- VS2010与Matlab2010b混合编程
环境: 1.VS2010 2.MATLAB 2010b 3.WINDOW 7 (X64) 1.Matlab环境设置 要建立独立运行的C应用程序,系统中需要安装Matlab.Matlab编译器.C/C+ ...
- 【EMV L2】2CS.001.00 ~ 2CS.007.00
测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...
- 【EMV L2】Select PSE应用选择相关的卡片数据格式
The data field of the response message contains the FCI specific to the selected PSE, DDF, or ADF. 一 ...
- 使用ueditor配置后台接口
因为后台是java,所以针对的是jsp版本的ueditor. 工程中需要导入jsp目录lib下的jar包.如果是maven管理的工程,可以导入jar包. 上传图片的功能的话,需要后台配置正确.如果需要 ...
- java语言基础--接口
接口定义: 是一个特殊的抽象类,在接口里面的所有方法都是抽象的. 接口用interface来声明. 注意: 接口中只能出现常量和抽象方法: 接口里面没有构造方法,无法创建接口的对象: 接口和接口之间支 ...
- SQLI DUMB SERIES-21
Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入) (1)登录成功后有以下页面: 其中红圈内的字符为admin ...
- conts、var 、let的区别
1.const定义的变量不可以直接修改,通过 this.a = 'kkk' 进行修改, 而且必须初始化. 2.var定义的变量可以修改,如果不初始化会输出undefined 3.let是块级作用域,函 ...