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或者sendmessage发送一个WM_CHAR消息, wp参数的值就是汉字的当前字符集的编码值

    

    

    

时间: 2024-08-03 14:39:43

WinSDK-键盘消息的相关文章

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

注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): TControl = class(TComponent) private // 15个私有消息处理,大多是鼠标消息.注意,消息函数大多只是一个中介,且TWinControl并不重写. procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; procedure WMLButtonDown(var Messa

鼠标键盘消息响应及系统热键注册

① 鼠标消息: WM_MOUSEMOVE     鼠标移动位置WM_LBUTTONDOWN       鼠标左键按下WM_LBUTTONUP     鼠标左键弹起WM_LBUTTONDBLCLK                    鼠标左键双击WM_RBUTTONDOWN                      鼠标右键按下WM_RBUTTONUP          鼠标右键弹起WM_RBUTTONDBLCLK   鼠标右键双击WM_MBUTTONDOWN       鼠标中键按下WM_MB

鼠标消息与键盘消息

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用.当然,鼠标在今天的应用程序中比10年前使用得更为广泛.甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏.画图程序.音乐程序,以及Web创览器等程序中就是这样.然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘. 相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机.早期的计算机程序员用键盘在 Hollerith卡片上打孔,以

WinAPI: GetKeyNameText - 根据键盘消息获取按键名称

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs; type  TForm1 = class(TForm)    procedure FormCreate(Sender: TObject);    procedure MyMsg(var msg: TWMKeyDown); message WM_KEYDOWN;  end;

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

基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情况下这些子窗口已经截获了焦点,因此键盘消息已经被控件捕获了:同时为了实现控件焦点切换和对话框默认行为,  VK_TAB.VK_LEFT.VK_RIGHT.VK_UP.VK_DOWN. VK_RETURN.VK_ESCAPE 等键已经被截获处理,因此对话框没有控件时仍然不能完全响应按键消息. 关于热键

键盘消息多次被触发

viewwillappear  添加 viewwillDisapear  移除 @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/css/cuteeditor.css);键盘消息多次被触发,布布扣,bubuko.com

第6章 键盘_6.3-6.4 字符消息、键盘消息和字符集

6.3 字符消息 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//Windows将根据击键消息.转义状态和键盘的国家/地区配置等信息,将扫描码转换成相应的字符码,如果可以组合成一个字符,则把字符消息放入应用程序的消息队列,产生WM_CHAR.WM_DEADCHAR等消息. DispatchMessage(&msg); } 6.3.1 四类字符消息(WM_CHAR\WM_DEADCHAR.WM_SYSCHAR\W

Hook 简单的实例--拦截鼠标和键盘消息(一)

Hook(钩子)就是对Windows系统的一些消息或是API函数进行拦截和监控的处理平台,让可以根据程序员的设置获取其感兴趣的信息. 这里主要是介绍一下Hook拦截鼠标消息和键盘消息. 下面是CALLBACK Proc 回调函数 和 CallNextHookEx函数 LRESULT CALLBACK HookProc ( int nCode, //指定是否需要处理该消息 WPARAM wParam, LPARAM lParam //包含该消息的附加消息 , ); 这个回调函数的名字可以随你取,但

键盘消息捕获

创建键盘接口: 有一个简单的方法:在窗口过程中增加WM_KEYDOWN逻辑,类似于复制了所有的WM_VSCROLL 和 WM_HSCROLL逻辑.但是,不管什么时候我们想修改滚动条逻辑,就不得不在WM_KEYDOWN消息上做同样的改变.这样的做法是不明智的 另一种更好的方法:把每一个WM_KEYDOWN消息转换为同等的WM_VSCROLL 或者 WM_HSCROLL消息.可以通过给窗口过程发送假的消息欺骗函数 WndProc函数,使她认为受到了滚动消息. 发送函数为SendMessage: Se

C++模拟键盘消息

实现功能:在现有DLL程序中向特定的EXE窗口中发送模拟键盘的消息 使用API根据窗口标题递归查找特定的窗口句柄,之后模拟调用. 注意:keybd_event函数不能在VS下使用,所以用SendInput代替使用: 1 int SelfFindWindows(HWND hMainWnd, char* lpName, BYTE keyvalue) 2 { 3 HWND hChildWnd = GetWindow(hMainWnd, GW_CHILD); 4 5 while (hChildWnd !