一 参考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-键盘消息的更多相关文章

  1. VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)

    基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...

  2. 使用PreTranslateMessage替代钩子函数处理键盘消息

    2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...

  3. 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息

    键盘消息 Windows系统无论何时只有一个窗口(可能是子窗口,也就是控件)能获得焦点. 焦点窗口通过windows消息来响应人的键盘操作,与键盘相关的常用消息罗列如下: WM_KEYDOWN   按 ...

  4. keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z

    首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...

  5. mfc对话框不能响应键盘消息

    这东西真是奇怪,找了半天原因,最终的发现却是让人抓狂,呵呵 现象:对话框按ESC或回车都不能关闭窗口(我没有处理PreTransplanteMessage),用spy++看,对话框完全收不到键盘消息 ...

  6. TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...

  7. MFC控件编程之鼠标跟键盘消息

    MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...

  8. 简单全局HOOK拦截大部分键盘消息

    前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...

  9. 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...

  10. C++模拟键盘消息

    实现功能:在现有DLL程序中向特定的EXE窗口中发送模拟键盘的消息 使用API根据窗口标题递归查找特定的窗口句柄,之后模拟调用. 注意:keybd_event函数不能在VS下使用,所以用SendInp ...

随机推荐

  1. 将lvm逻辑卷分出一部分

    今天公司磁盘报警,查看磁盘发现挂载的/aa空间还很多,而/ee 空间不足,现将/aa上的lvm分出一部分空间.加到/ee上 注:首先要 df  -T  -h 开一下磁盘格式如果是xfs格式的lvm  ...

  2. 最近的AI

    虚拟币和AI  两个大类怎么兴起?

  3. java Boolean和boolean的区别

    Boolean b1=new Boolean("false"); Boolean b2=new Boolean("tRue"); Boolean b3=new ...

  4. 使用min-device-pixel-ratio媒体功能实现真正的1像素border

    关于设备像素比的知识,想必做过移动端开发的都有接触,这里就不介绍啦,万一有不懂的可以看张鑫旭大神的设备像素比devicePixelRatio简单介绍 由于设备像素比存在的原因,我们在处理设计图的一些边 ...

  5. 服务端渲染时无法获得环境变量的值,一直是undefined

    1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie

  6. Mysql update指定区间的数据

    ,) as a) Mysql 中 limit不能作为字句,所以要在limit外面再嵌套一层select

  7. vue修改框架样式/deep/

    /deep/ 父元素的样式名 /deep/ 要修改的样式名 使用 ... 貌似不行

  8. Linux与Windows的几点区别

    echo $PATH 回显Linux环境变量PATH的值,Linux下的环境变量必须大写echo %path% 回显Windows环境变量path的值 export PATH=/usr/local/t ...

  9. JavaWeb(二)

    三.搭建JavaWeb应用开发环境——Tomcat服务器 3.1.疑问:学习web开发,为什么必须要先装一个WEB服务器? 在本地计算机上随便创建一个web页面,用户是无法访问到的,但是如果启动tom ...

  10. input元素的required属性引发的血案

    罪魁祸首===> 1,input 有一个tel类型,为移动端设置的 2,input的radio类型是根据name区分的,与id.class无关 3,<!DOCTYPE html>:文 ...