收到 WM_KEYDOWN 消息时 lParam 的行为是什么?

Don*_*ote 0 c++ winapi lparam

我开始使用 c++ 语言学习 winapi。我试图了解lParamWM_KEYDOWN 消息。

来自微软文档:

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

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

24:指示该键是否为扩展键,例如出现在增强型 101 键或 102 键键盘上的右侧 ALT 和 CTRL 键。如果是扩展键,则值为 1;否则为 0。

25-28:保留;不使用。

29:上下文代码。WM_KEYDOWN 消息的值始终为 0。

30 : 前一个键状态。如果在发送消息之前键处于关闭状态,则值为 1,如果键处于向上状态,则值为 0。

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;
Run Code Online (Sandbox Code Playgroud)

如果我按键盘上的“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
Run Code Online (Sandbox Code Playgroud)

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

我怎么能理解呢?

Chr*_*sMM 6

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

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) << ", ";
Run Code Online (Sandbox Code Playgroud)