代码之家  ›  专栏  ›  技术社区  ›  Nick Van Brunt

只响应第一个wm_keydown通知?

  •  4
  • Nick Van Brunt  · 技术社区  · 15 年前

    win32应用程序如何只响应第一个wm_keydown通知?msdn docs claim bit 30“指定以前的密钥状态。如果在发送消息之前密钥已关闭,则值为1;如果密钥已打开,则值为零。”但在我的wndproc中,位30始终为0。

    case WM_KEYDOWN:
        // ToDo - stop multiple notifications for repeating keys
        printf("WM_KEYDOWN %i %i", wParam, lParam & 30);
        return 0;
    

    LPARAM和30 问这个的方式不对?我还做错什么了吗?

    4 回复  |  直到 10 年前
        1
  •  4
  •   RichieHindle    15 年前

    要获得第30位,您需要:

    (lParam & 0x40000000)
    

    另一种方法是使用0-15位来获得重复计数:

    int repeatCount = (lParam & 0xffff)
    

    只有在repeat count为0(或者可能为1;我不确定第一条消息的repeat count是0还是1,文档中也不清楚)时才能执行任何操作。

        2
  •  11
  •   sharptooth    15 年前

    要测试第30位,不要使用30位,而是使用1<<30位。

    const bool isBitSet = lParam & (1 << 30);
    
        3
  •  2
  •   Sanders    10 年前

    按位与 (lParam & 0x4000000) 可以,但使用windows.h中包含的定义(您已经在使用它 WM_KEYDOWN )以下内容:

    case WM_KEYDOWN:
        if((HIWORD(lParam) & KF_REPEAT) == 0) //process wParam
        return 0;
    

    HIWORD 取最有效的16位。

    KF_REPEAT (=0x4000)标记表示重复的位的位置 wm_键关闭 消息。

    当repeat标志关闭(初始按键)时,这些值的位与等于0,在释放按键之前,每个后续时间(autorepeat功能)都等于1。

    这是一件小事,但它对提高代码的可读性有很大的帮助。 0x40000000 对读者来说没有任何意义,但可以从中推断出很多 kf-重复 .

        4
  •  0
  •   Pratik Bhatt    15 年前

    执行lparam&30的问题在于,这里的“30”被认为是十进制的,当转换为二进制时,它将是“11110”。因此,您不是在测试位30,而是只获取lparam&11110的结果。

    希望这有助于澄清问题。

    推荐文章