【问题标题】:stuck keyboard input due to wm_keyup由于 wm_keyup 导致键盘输入卡住
【发布时间】:2012-03-05 09:57:34
【问题描述】:

我有一个问题,我认为是由于未正确发送 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 中要多,我不知道为什么。我之前在做更简单的非多线程代码时也得到了它。我不知道如何解决这个问题。

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

【问题讨论】:

  • 嗯,你关注WM_ACTIVATEAPP了吗?

标签: c++ winapi input keyboard


【解决方案1】:

查看 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2010-10-17
    • 2020-05-07
    • 2020-05-13
    • 2022-12-18
    • 2012-10-04
    相关资源
    最近更新 更多