繁体   English   中英

需要有关WM_KEYDOWN的帮助

[英]Need help with WM_KEYDOWN

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

如果您持续按住一个按钮,我希望程序直接实现它。

我试图用DirectX制作游戏。 请告诉我是否应该使用WM_KEYDOWN以外的其他东西。

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

您不能做太多事情,因为您必须等待一段时间才能知道按钮是否被按下。

但是,您可以做的是忽略Windows中的连续WM_KEYDOWN事件,并将按钮视为被按下且直到释放WM_KEYUP事件才释放。 让我们将其称为下注,或者甚至更好的是分支优化。

这可能不完全是您要遵循的行为,但是您不能简单地忽略其他WM_KEYDOWN消息,直到收到WM_KEYUP吗?

您可以使用布尔变量,并在按键按下时将其设置为true。 如果变量的值为true,则停止执行该操作。 当键按下时,将变量设置为false。

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

当然,如果要连续执行某项操作,则应例如在if(!keydown)语句中设置计时器,并在用户释放键时停止计时器。

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

从MSDN:lParam位30:指定先前的键状态。 如果在发送消息之前按键已按下,则值为1;如果按键已按下,则值为0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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