WinSDK-键盘消息

Posted talenth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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-键盘消息的主要内容,如果未能解决你的问题,请参考以下文章

如何用 sendmessage 发送键盘按键消息

android系统下怎么广播键盘的输入消息

09 Windows编程——键盘消息

如何在父窗口之后要求键盘钩子处理消息

如何输入整数并打印消息(数字键盘)

如何监听windows虚拟键盘