我目前正在尝试从 WM_KEYDOWN 和 WM_CHAR 消息获取KeyBoard输入,用于我自己的InputBox。
这是我用于基本输入的代码,适用于字符:
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 message,但是找不到与间隔相关的任何内容。
答案 0 :(得分: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...
}
上述功能可以在任何您喜欢的地方使用,因此您更新的频率完全取决于您。如前所述,这是无缓冲输入,面向状态,而缓冲输入是面向事件的。
答案 1 :(得分:0)
我认为这种内部延迟不容易修改。 一种方法是编写自己的通用密钥处理程序,以跟踪所有密钥的状态。例如,包含所有按键的键码的列表。在 WM_KEYDOWN 上,您将键码添加到列表中,然后在 WM_KEYUP 上将其删除。然后创建类似计时器的东西,它只是在所需的延迟时间内通知您,并为列表的每个元素调用您的键处理函数。