需要帮助WM_KEYDOWN

时间:2010-08-31 19:49:11

标签: c++ winapi messages

我需要WM_KEYDOWN的帮助,我想删除第一个按键和重复按键之间的“暂停”。

如果你不断按下按钮,我希望程序直接实现它。

我试图用directx制作游戏。请告诉我是否应该使用WM_KEYDOWN之外的其他内容。

4 个答案:

答案 0 :(得分:2)

请定期“持续”。如果用户按下按钮并立即释放,则会立即发生WM_KEYDOWNWM_KEYUP事件。否则,如果用户在一段时间内未释放密钥,Windows将使用某个内部计时器检测到该密钥,并继续触发WM_KEYDOWN个事件,直到释放按钮为止。

你不能做太多的事情,因为你必须等待一段时间才能判断一个按钮是否被按下而没有被释放。

但是,您可以做的是忽略来自Windows的连续WM_KEYDOWN事件,并将按钮视为已按下,并且在您收到WM_KEYUP事件之前不会释放。我们称之为下注,或者更好的是分支优化。

答案 1 :(得分:2)

这可能不完全是您所追求的行为,但在收到WM_KEYDOWN之前,您不能简单地忽略其他WM_KEYUP消息吗?

答案 2 :(得分:1)

您可以使用布尔变量,并在键关闭时将它们设置为true。如果变量的值为true,则停止执行操作。当密钥启动时,您将变量设置为false。

// ...
some switch
// ...
case WM_KEYDOWN:
    if (!keydown) {
        // do the magic
        keydown=true;
    }
break;
case WM_KEYUP:
    keydown=false;
break;

当然,如果你想连续做某事,你应该在if(!keydown)语句中设置一个计时器,并在用户释放密钥时停止计时器。

答案 3 :(得分:0)

WM_KEYDOWN附带一个标志,指示WM_KEYDOWN是第一个还是重复的WM_KEYDOWN。只需在MSDN中搜索WM_KEYDOWN即可找到它。

来自MSDN: lParam位30:指定上一个键状态。如果在发送消息之前密钥已关闭,则值为1;如果密钥已启动,则该值为零。