由于wm_keyup导致键盘输入卡住

时间:2012-02-14 00:13:53

标签: c++ winapi input keyboard

我有一个问题,我认为是由于没有正确发送wm_keyup消息引起的。我相信当你移动你的角色并且输入会被“卡住”时,Minecraft也会出现同样的问题。按下它后,键的动作会继续,并且在您再次点击该键之前不会停止。我听说它可能是Windows和键盘之间的问题,但我不完全确定。此外,大多数其他主流游戏没有这个问题所以必须有一个正确的方法来做到这一点。这就是我的Windows程序代码:

    case WM_KEYDOWN:
        for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t)
            (*t).PushKeyDown(ConvertKeyCode(wparam));
    return 0;

    case WM_KEYUP:
        for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t)
            (*t).PushKeyUp(ConvertKeyCode(wparam));
    return 0;

每个KeyInput对象都有一个用键输入填充的队列,并在请求键盘输入时清空。此代码适用于多线程游戏,此技术可确保在任何线程上都不会丢失任何输入。我在KeyInput对象中使用互斥。

我在游戏中比在Minecraft中更多地遇到这个问题,我不明白为什么。当我做更简单的非多线程代码时,我也得到了它。我不知道如何解决这个问题。

我感谢任何人提供的任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

在查看WM_KEYDOWN消息的文档后,我发现第31位的lparam告诉最后一个keydown消息是否与最新消息相同。如果您使用此信息忽略重复消息,则可以解决问题(但是当按下该键时,您将丢失重复输入的输入)。这是我的代码:

case WM_KEYDOWN:
{
    union
    {
        uint lparam;
        struct { uint bits:30,_30:1,_31:1; };
    } lparam_data;
    lparam_data.lparam = lparam;

    if (!lparam_data._30)
        // key was pushed
    return 0;
}