美文网首页
windows按键事件之一二

windows按键事件之一二

作者: 赵海洋 | 来源:发表于2018-12-20 15:11 被阅读0次

    在一个项目(可以想像成响应键盘动作的小游戏)中,出招需要用到Alt键,一开始想只使用普通的WM_KEYDOWN和WM_KEYUP来处理,取其wparam就是按键的virtual key了。
    但是发现ALT键只能偶尔收到WM_KEYUP,并不能收到WM_KEYDOWN,经过实现有以下组合情况:

    1. ALT -> ALT+1 -> ALT -> 无按键

    image.png

    ALT转到ALT+1,然后先放开按键1,再放ALT,这时只有ALT是消息不对称的,即按下时WM_SYSKEYDOWN,松开是WM_KEYUP。

    2. ALT->ALT+1->1->无按键

    image.png

    ALT转到ALT+1,然后先放开按键ALT. 这种情况就和上面的消息组合不一样了,这时ALT和1键都是消息不对称的了,按下时WM_SYSKEYDOWN,松开是WM_KEYUP。

    3. 1 -> ALT+1 -> 1 -> 无按键

    image.png
    这种情况先按下1,会有一个1的WM_KEYDOWN消息,并且接着有多个WM_KEYDOWN,根据LParam能区分出来是长按时重复发送的消息。
    然后按下ALT,有一个WM_SYSKEYDOWN消息,先松开ALT,有一个WM_SYSKEYUP消息。
    但是松开1时并没有WM_KEYUP消息了。
    后来发现这个问题仅在窗口风格是WS_OVERLAPPEDWINDOW时出现,如果窗口风格是WS_POPUP时就不会出现。

    4. ATL->无按键->ALT

    快速连点两次ALT时,消息如下:

    image.png
    仅有一个WM_SYSKEYDOWN的消息,有两次松开的消息。
    后来发现这个问题仅在窗口风格是WS_OVERLAPPEDWINDOW时出现,如果窗口风格是WS_POPUP时就不会出现。

    5.F10的特殊性

    F10触发WM_SYSKEYDOWN消息

    6.ACCELERATORS

    如果Fxx键注册了系统加速键,如F11,则没有WM_SYSKEYDOWN的消息了,只有普通的WM_KEYUP消息。
    这个的原因似乎是在消息处理循环中检测到加速键后,中断了消息继续发送。

    if (::TranslateAccelerator(m_hWndPaint, m_hAccTable, pMsg))
            {
                return true;
            }
    

    相关文章

      网友评论

          本文标题:windows按键事件之一二

          本文链接:https://www.haomeiwen.com/subject/ctpykqtx.html