键盘消息
键盘消息分为击键消息和字符消息
击键消息,如
WM_KEYDOWN
WM_KEYUP
WM_SYSKEYDOWN
WM_SYSKEYUP
字符消息,如
WM_CHAR
WM_DEADCHAR
WM_SYSCHAR
WM_SYSDEADCHAR
//带有SYS表示一般交给DefWindowProc处理,如包含Alt的击键
击键消息
以WM_KEYDOWN 消息为例:
消息含义:
当一个非系统按键被按下的时候,发送到键盘焦点所在窗口的消息。
非系统按键指的是没有与 ALT 键同时按下的任何按键。
消息定义:
#define WM_KEYDOWN 0x0100
参数:
wParam:指定该按键的虚拟键代码。
lParam:指定重复计数、OEM 扫描码、扩展键标记、内容代码、先前状态和转换状态,具体含义和表示方法如下:
位 | 含义 |
0-15 | 1. 当前消息被重复的次数 2. 当用户按下按键不松开时,Windows 会将该键产生的所有 WM_KEYDOWN 消息合称为一个消息,并增加该字段的值 3. 重复计数大于 1 表明此时连续击键的速度快于程序的处理能力 |
16-23 | OEM 扫描码(键盘硬件产生的代码) |
24 | 1. 指定该按键是否扩展键 2. 比如 IBM 加强型键盘有 101 或 102 个键,右边的 ALT 和 CTRL 就是扩展键 |
25-28 | 系统保留 |
29 | 内容代码:对于 WM_KEYDOWN 消息来说,这个值总是 0 |
30 | 先前状态:在消息发送前如果按键是被按下的话该值是 1,否则是 0 |
31 | 转换状态:对于 WM_KEYDOWN 消息来说,这个值总是 0 |
键盘扫描码:是基于键盘硬件真实的扫描码,可能因键盘的厂家,型号不同而有所不同
虚拟键代码:Microsoft为消除扫描码弊端,把各个按键的扫描码映射成的代码(不区分大小写,即大小写字符虚拟键代码相同)
字符消息
击键消息通过 TranslateMessage() 函数转换为字符消息。
参数:
wParam:ANSI字符码或Unicode字符码
lParam:同击键消息
//如果注册窗口类时调用的 RegisterClass 被宏定义为 RegisterClassW 则表示使用的是Unicode字符码,如果被宏定义为 RegisterClassA则表示使用的是ANSI字符码。也可以通过 IsWindowUnicode()函数判断。