gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:40 25 4
gpt4 key购买 nike

我有一个问题,我认为是由于未正确发送 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com