C++ 由于wm_keyup,键盘输入卡滞

C++ 由于wm_keyup,键盘输入卡滞,c++,winapi,input,keyboard,C++,Winapi,Input,Keyboard,我有一个问题,我认为是由于wm_keyup消息未正确发送造成的。我相信同样的问题也会发生在Minecraft中,当你移动你的角色时,输入会被“卡住”。按键操作在您按下后继续,直到您再次轻触按键后才会停止。我听说这可能是windows和键盘之间的问题,但我不完全确定。而且,大多数其他主流游戏都没有这个问题,所以必须有一个正确的方法来解决。这就是我的windows过程代码的样子: case WM_KEYDOWN: for (list<KeyInput>::iter

我有一个问题,我认为是由于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;
case WM\u KEYDOWN:
for(list::iterator t=key_inputs.begin();t!=key_inputs.end();++t)
(*t).PushKeyDown(ConvertKeyCode(wparam));
返回0;
案例WM_KEYUP:
for(list::iterator t=key_inputs.begin();t!=key_inputs.end();++t)
(t.PushKeyUp)(ConvertKeyCode(wparam);;
返回0;
每个KeyInput对象都有一个队列,队列中充满了键输入,并在请求键盘输入时清空。此代码用于多线程游戏,此技术确保任何线程上都不会丢失任何输入。我在KeyInput对象中使用互斥

我在游戏中遇到的问题比在Minecraft中更多,我不知道为什么。我以前在编写更简单的非多线程代码时也得到了它。我不知道怎么解决这个问题


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

在查看WM_KEYDOWN消息的文档后,我发现LPRAM的第31位指示最后一条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;
}

嗯,你在关注WM_ACTIVATEAPP吗?