[英]C++ WM_KEYDOWN different intervals
我目前正在尝试从WM_KEYDOWN和WM_CHAR消息中获取自己的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消息 ,但是找不到与间隔有关的任何内容。
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...
}
上面的功能可以在任何地方使用,因此更新的频率完全取决于您。 如前所述,这是未缓冲的输入,并且是面向状态的,而缓冲输入的是事件是面向的。
我认为这种内部延迟不能轻易修改。 一种方法是编写自己的通用密钥处理程序,以跟踪所有密钥的状态。 例如,一个列表包含所有按下的键的键控代码。 在WM_KEYDOWN上 ,将密钥代码添加到列表中,在WM_KEYUP上 ,将其删除。 然后创建类似计时器的内容,该计时器仅在所需的延迟时间内通知您,并为列表的每个元素调用密钥处理函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.