繁体   English   中英

C ++ WM_KEYDOWN不同的间隔

[英]C++ WM_KEYDOWN different intervals

我目前正在尝试从WM_KEYDOWNWM_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM