c++ - 由于 wm_keyup 而卡住键盘输入

标签 c++ winapi input keyboard

我有一个问题,我认为是由于未正确发送 wm_keyup 消息引起的。我相信当您移动角色并且输入会“卡住”时,Minecraft 中也会出现同样的问题。按键的 Action 在您按下后会继续,直到您再次点击该按键才会停止。我听说这可能是 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 中更容易遇到这个问题,我不知道为什么。我之前在做更简单的非多线程代码时也得到了它。我不知道如何解决这个问题。

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

最佳答案

在查看 WM_KEYDOWN 消息的文档后,我发现 lparam 的第 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;
}

关于c++ - 由于 wm_keyup 而卡住键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270009/

相关文章:

javascript - 如何阻止浏览器默认输入验证?

c++ - 如何将用户定义类型转换为原始类型?

c++ - Qt Creator,全屏 View

c++ - 如何检测用户是否按下了 Ctrl-Alt-Del 或 Alt-Tab 以便我可以最小化我的程序?

delphi - 我怎样才能等到外部进程完成?

html - 在 html 表格中对齐按钮。 IE问题(楼梯问题)

c++ - 需要 C 和 C++ 中的未定义行为吗?

c++ - 代码 : C++ error: unknown type name 'class' did you mean 'Class'

c# - 如何判断一个Windows应用程序是否在屏幕外?

html - 删除输入文件按钮并设置所选文件的样式