当前位置:C++技术网 > 精选软件 > 分析WM_KEYDOWN的lParam参数确定按键的状态

分析WM_KEYDOWN的lParam参数确定按键的状态

更新时间:2016-01-07 00:12:40浏览次数:1+次

    通过重复计数,你可以检测按键长按时重复产生了多少个消息;

    通过OEM扫描码你可以确定按下了哪个物理按键;

    通过扩展键标志,可以检测按下的按键是否为扩展键;

    通过环境代码可以检测是否按下了系统键;

    通过键的先前状态,可以判定按键之前是弹起的还是按下的,或者是不是正处于长按状态;

    通过转换状态,可以判断当前按键是否被按下。

    环境代码用于判断Alt键是否被按下,或者说理解为系统按键消息和非系统按键消息的区别。Alt键被按下,触发的是WM_SYSKEYDOWN,此时环境代码为1。而WM_KEYDOWN消息触发时,环境代码是0。这个可用来区分按键是否为系统键。

    然而在活动窗口最小化时,所有的按键被按下,包括非系统键,产生的都是系统按键按下消息WM_SYSKEYDOWN。然而环境代码却是0。我们可以理解为环境代码用来识别按键的类型,而不完全是消息的类型。因为按键的类型是非系统键,所以,最终环境代码还是0,并没有因为产生的是系统按键消息WM_SYSKEYDOWN而让环境代码变为1.如此看来这个环境代码可用来区分系统键和非系统键的,而无视消息类型。所以在处理系统按键消息时,也并不一定是系统键产生的。这个环境代码可以帮忙判断。

    对于非美国键盘来讲,可能通过Shift、Ctrl、Alt与其他键组合产生字符,此时的环境代码也为1.此时确实是一个例外。前面一个例外我可以归并到一种类型去了。也就是将环境代码解释为确定实际按键的类型,即按下或者释放的按键是系统键还是非系统键。对于非系统按键产生了环境代码为1的情况,无法再归类合并。此时只能另行处理。此时只能根据具体的情况来判定了。

    转换状态则比较逗逼。如果按键正被按下,则为0.如果正被释放,则为1.按下按键就产生KEYDOWN类型消息,自然就是0。如果是弹起按键,自然就是1.而这里额外增加一个状态,不只是何用意?本来处理键盘按下和弹起就可以知道键盘按键当前的状态了,何必在加上一个状态位呢?反正我现在没有想清楚,可能是我绕进去了,如果你知道的话,请告诉我下。
    对于环境代码和转换状态则没有单独写文章说明,就在此简单说明了一下。其他的几个状态都写了文章详细解释了。
    下面是各个分析说明的文章列表:
    重复计数长按键盘按键的WM_KEYDOWN消息的重复计数原理和作用分析及代码验证
    OEM扫描码键盘OEM扫描码深入分析以及OEM扫描码与键盘虚拟键码的关系
    扩展键标志键盘的扩展键有哪些,用程序检测提取扩展键
    键的先前状态怎么判断按键当前是否处于长按按键状态