【问题标题】:What is the behaviour of lParam when WM_KEYDOWN message recived?收到 WM_KEYDOWN 消息时 lParam 的行为是什么?
【发布时间】:2020-05-28 13:51:12
【问题描述】:

我开始使用 c++ 语言学习 winapi。 我正在尝试了解 WM_KEYDOWN 消息上的 lParam

来自 Microsoft 文档:

0-15:当前消息的重复次数。值是数字 由于用户按住而自动重复击键的次数 放下钥匙。如果按键保持足够长的时间,多条消息 被发送。但是,重复计数不是累积的。

16-23:扫描 代码。该值取决于 OEM。

24:表示密钥是否为 扩展键,例如出现在右侧的 ALT 和 CTRL 键 增强的 101 或 102 键键盘。如果它是一个,则值为 1 扩展键;否则为0。

25-28:保留;不要使用。

29:上下文代码。对于 WM_KEYDOWN 消息,该值始终为 0。

30:之前的按键状态。如果键在之前关闭,则值为 1 消息被发送,或者如果 key 是 up 则为零。

31:过渡状态。对于 WM_KEYDOWN 消息,该值始终为 0。

我正在通过这种方式处理此消息:

case WM_KEYDOWN:
    cout << ((lParam & 0b11111111111111110000000000000000) >> 16) << ", ";
    cout << ((lParam & 0b00000000000000001111111100000000) >> 8) << ", ";
    cout << ((lParam & 0b00000000000000000000000010000000) >> 7) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000100) >> 2) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000010) >> 1) << ", ";
    cout << ((lParam & 0b00000000000000000000000000000001) >> 0) << endl;

如果我按下键盘上的“A”按钮,我会得到输出: 30, 0, 0, 0, 0, 1

如果我按住“A”按钮,我会得到多个输出:

16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1

如果我按其他字母按钮,我会得到相同的结果,但有其他第一个数字。 (例如,对于“B”按钮,我得到 48 作为简单的按下,49200 作为按住)

我怎么理解?

【问题讨论】:

    标签: c++ winapi lparam


    【解决方案1】:

    我没有对此进行测试,但您的位顺序似乎颠倒了。根据MS Documentation,位 0-15 是 LOW 位。

    case WM_KEYDOWN:
        cout << ((lParam & 0b00000000000000001111111111111111) >> 0) << ", ";
        cout << ((lParam & 0b00000000111111110000000000000000) >> 16) << ", ";
        cout << ((lParam & 0b00000001000000000000000000000000) >> 24) << ", ";
        cout << ((lParam & 0b00100000000000000000000000000000) >> 29) << ", ";
        cout << ((lParam & 0b01000000000000000000000000000000) >> 30) << ", ";
        cout << ((lParam & 0b10000000000000000000000000000000) >> 31) << ", ";
    

    【讨论】:

    • 0b00000000000000001111111111111111 不会自动重新存储在内存中吗?
    • @don 如果是这样(例如,在 little-endian 架构上),那么通过 lParam 传递的文字和值都会得到 "reversed"
    • @Don2Quixote,在 little endian 中,这些值以反向(按字节)存储在内存中。当加载到寄存器中执行这些操作时,它们会以正确的顺序加载。
    • 这些是数字,而不是被转换为数字的内存字节。这里没有“反向”。数字只是数字。仅当您将数字存储到内存中然后以字节而不是数字的形式读回时,字节序才适用。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多