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 ...
随机推荐
- Linux 环境下安装Redis的步骤
#进入usr/local目录cd /usr/local#下载1.wget http://download.redis.io/releases/redis-4.0.10.tar.gz#解压2.tar x ...
- 如何通过Chrome远程调试android设备上的Web网站
网上的帖子很多,但很多都是老版本的,试过了,根本不管用,花了一天时间,终于在本机试验通过了,特记录下来,以备用.有需要的朋友也可以参考.先上一张图,看看PC端chrome上调试的效果: 左边是手机的模 ...
- mathematics of deep learning (paper reading)
1.数学上,不变性 2.信息论上
- docker1
Docker笔记 1, https://gitlab-demo.com Docker官网:https://docs.docker.com/install/overview/ 有两个版本: Docker ...
- ReentrantLock+线程池+同步+线程锁
1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...
- google搜索引擎使用
部分引用 http://yearslater.me/2017/06/15/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%90%9C%E7%B4%A2%E5%BC%95 ...
- postman Could not get any response。
浏览器输入地址可以返回结果,但是由于返回的json没有格式,看起来比较麻烦,用postman却报错Could not get any response. 可以注意到下面写了可能的情况:比如服务器无响应 ...
- JVM垃圾收集器-Serial收集器
今天我给大家分享的是Serial收集器,垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同的版本的虚拟机所提供的垃圾收集器都可能会有很大 ...
- 第一次Scrum冲刺——Life in CCSU
一.第一次Scrum任务 首先集体讨论确定全局规划,然后进行切割分工,按照规划实现全部功能.现在基于用户的基本需求做一部分. 二.用户故事 1.用户打开APP,进入登录界面: 2.用户输入账号和密码: ...
- 【[AHOI2005]洗牌 题解
一道好题. 首先是数据范围. 0<N≤10^10 ,0 ≤M≤10^10,且N为偶数 这是这道题的坑点,也是痛点. 10^10表示这这道题必有规律. 那么,first step,我们先探索规律. ...