3.2 键盘消息

键盘消息分类

  • 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。这种顺序确保了按键按下、字符输入和按键释放的事件能够被正确处理。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里捡到一只猫丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值