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 ... 
随机推荐
- phpexcel 使用说明
			下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ... 
- TP5对数据库操作的事物作用
			假如: 你写好了一段完整的代码,模型对数据库的操作,增删改查什么的,都没有问题,当然运行速度也是最快的,完全不用担心会出错, 前提肯定是已经写好的一整段代码, 但是,万一服务器中断了呢,执行一半,后面 ... 
- C语言权威指南和书单 - 专家级别
			注: 点击标题即可下载 1. Advanced Programming in the UNIX Environment, 3rd Edition 2. Essential C 3. Computer ... 
- 看书记笔记 书名21天学C#
			☆:为重点★:为科普△:注▲:术语 前言概述 ☆一门语言必须包括诸如异常处理,无用单元收集,可扩展数据类型以及代码安全性等特征☆C#特性:简单性,面向对象,模块性,灵活性,简明性 ☆C#面向对象的封装 ... 
- 《HTTP权威指南》读书笔记(一)
			1.因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都搭上了名为MIME类型的数据格式标签.WEB服务器会为所有HTTP对象数据附加一个MIME类型.当Web浏览器从服务器中 ... 
- css flex方法标题左右两边平衡线
			<html> <div class="title"> <div class="line"></div> < ... 
- Jquery图集
- echarts立体效果地图-自定义区域及文字
			setgeomap: function (_id, _fn) { // 全城拥堵占比 GLOBAL.myMapChart = echarts.init(document.getElementById( ... 
- js date 和 math
			Math 用于执行常用的数学任务 console.log(Math.E); 自然数底数2.718 console.log(Math.PI); 圆周率3.1415926 console.log(Math ... 
- 第二次实验:CC2530平台上GPIO组件的TinyOS编程
			实验二 CC2530平台上GPIO组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生理解和掌握CC2530的GPIO及外部中断,及其TinyOS编程方法 学 ... 
