0

我目前正在尝试从我自己的 InputBox的WM_KEYDOWNWM_CHAR消息中获取键盘输入。

这是我用于基本输入的代码,它适用于字符:

if(msg.message == WM_KEYDOWN)
{
    keyHandled = false;
    //handle other keys here, e.g. VK_LEFT
}
else if(msg.message == WM_CHAR && !keyHandled)
{
    keyHandled = true;
    gui->UpdateInput(msg.wParam);
}

如果被按下的键也是触发WM_CHAR消息的键,则间隔与通常的输入框中一样。
但是,如果它是像VK_LEFT这样的键,它会不断收到WM_KEYDOWN消息,不会有任何延迟。

有什么方法可以让我以相同的间隔接收所有键,还是我必须实现一个计时器来处理消息之间的延迟?我还查看了 msdn 上的WM_KEYDOWN 消息,但我找不到与间隔相关的任何内容。

4

2 回答 2

1

Windows 对从键盘输入发送键盘事件有自己的延迟,这不是您可以简单更改的。如您所知,按住一个键将产生第一条消息,延迟,然后是一系列更多消息,间隔更快。您可以通过请求状态而不是直接依赖消息来解决此问题。这称为无缓冲输入并且是面向状态的。要存储您的状态,您可以执行以下操作:

bool keys[256];

当您检查 Windows 事件时,您可以像这样相应地更新键状态:

//In your WinProc function most likely
if (msg.message == WM_KEYDOWN)
{
    keys[msg.wParam] = true;
}

if (msg.message == WM_KEYUP)
{
    keys[msg.wParam] = false;
}

然后,您可以随时通过以下函数请求特定键的状态:

bool getKeyPressed(char keycode)
{
    return keys[keycode];
}

例如:

//This could be in some random update function and called
//whenever you need the information.
if (getKeyPressed(VK_UP))
{
//Do something here...
}

上面的功能可以在任何你想要的地方使用,因此你更新的频率完全取决于你。如前所述,这是无缓冲输入并且是面向状态的,而缓冲输入是面向事件的。

于 2013-07-26T14:30:28.340 回答
0

我认为这种内部延迟不能轻易修改。一种方法可能是编写您自己的通用密钥处理程序来跟踪所有密钥的状态。例如,一个列表包含所有按下的键的键码。在WM_KEYDOWN上将键码添加到列表中,在WM_KEYUP上将其删除。然后创建一个类似计时器的东西,它只是在所需的延迟时间通知您,并为列表的每个元素调用您的键处理函数。

于 2013-07-26T12:45:09.177 回答