键盘消息分类
- WM_KEYDOWN 按键被按下时产生
- WM_KEYUP 按键被放开时产生
- WM_SYSKEYDOWN 系统键按下时产生 例如ALT、F10
- WM_SYSKEYUP 系统键放开时产生
附带信息:
WPARAM 按键的Virtual Key
LPARAM 按键的参数,例如按下次数
键盘消息通常包含以下信息:
- 消息类型(如WM_KEYDOWN, WM_KEYUP等)
- 虚拟键码(Virtual Key Code):表示按下的具体按键
- 扫描码(Scan Code):键盘硬件相关的代码
- 附加信息:如重复次数、前一个键状态等
字符消息
字符消息(Character Messages)在Windows操作系统中用于处理键盘输入的字符数据。
- TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。
- 附带信息
WPARAM 输入的字符的ASCII字符编码值
LPARAM 按键的相关参数
字符消息通常是从键盘消息(如WM_KEYDOWN)转换而来的。具体流程如下:
1.当用户按下一个键时,系统生成一个WM_KEYDOWN消息。
2.如果消息循环包含TranslateMessage函数,系统会将可见字符的WM_KEYDOWN消息转换为WM_CHAR消息,并将其放回消息队列中。
TranslateMessage主要用于将虚拟键消息转换为字符消息。它将键盘输入从设备无关的虚拟键码转换为实际的字符。
工作原理
1.接收按键消息(如WM_KEYDOWN, WM_KEYUP等)
2.根据键码值获知哪个按键被按下,如果是不可见字符按键,直接return,如果是可见字符按键,查看CapsLock是否处于打开状态,这样就可以区分大小写了,将这些消息转换为字符消息(如WM_CHAR, WM_DEADCHAR等)
3。使用PostMessage将转换后的字符消息投递到调用线程的消息队列中
参数和返回值
- 参数:接受一个指向MSG结构的指针
- 返回值:如果消息被转换(即字符消息被投递到队列中),返回非零值;否则返回零
特点
- 不修改原始消息:TranslateMessage不会修改传递给它的消息结构内容
- 生成新消息:它会生成新的字符消息并将其添加到消息队列中
- 仅处理映射到ASCII字符的键:只有键盘驱动程序映射到ASCII字符的键才会生成WM_CHAR消息
完整的处理过程:
WM_KEYDOWN消息产生在系统消息队列,然后分发给应用程序消息队列
GetMessage抓取到这个WM_KEYDOWN消息
TranslateMessage发现下可见字符,进行翻译,将其转换为WM_CHAR字符消息再丢回系统消息队列,TranslateMessage就结束了,WM_KEYDOWN消息就到了DisPatchMessage这里,再由其交给窗口处理函数WndProc进行处理
被TranslateMessage丢到系统队列的WM_CHAR字符消息不会停滞太久,系统转发将WM_CHAR字符消息再次转发到程序消息队列,GetMessage再将其抓出来,TranslateMessage发现是字符消息,就直接return,WM_CHAR字符消息就到了DisPatchMessage这里,再由其交给窗口处理函数WndProc进行处理
消息处理顺序是先处理WM_KEYDOWN,然后是WM_CHAR(如果有TranslateMessage的调用),最后是WM_KEYUP。这种顺序确保了按键按下、字符输入和按键释放的事件能够被正确处理。