我如何让getkeystate忽略重复?

时间:2019-04-03 21:11:49

标签: c++ winapi

while (thing happens)
{
    if (GetKeyState('a') & 0x8000) { std::cout << "a"; }
}

此代码每次按“ a”都会打印多次。

有没有一种方法可以在按键持续时间内忽略重复?这样,如果我分别键入“ a”和“ a”,则仍将算作两次按键,但是如果按住“ a”,则仅算作一次。

2 个答案:

答案 0 :(得分:0)

您应该使用WM_KEYDOWNWM_KEYUP,因为GetKeyState会检查键的调用时间,因此,如果您在循环中调用它1000次,则如果键被按下,它将返回1000键。在WM_KEYDOWN中,记录一个“键已关闭”标志并在WM_KEYUP上释放它:

if (uMsg == WM_KEYDOWN && wParam == myVK && kDown == false) 
{
    // key is down
    kDown = true;
}
if (uMsg == WM_KEYUP && wParam == myVk)
{
    // key is up
    kDown = false;

}

您还可以使用GetKeyNameText()帮助您了解传递给WM_KEY消息的参数。

答案 1 :(得分:0)

首先,“ a”的虚拟键值为0x41,否则您应该使用“ A”。然后,您可以尝试以下解决方案:

while (thing happens)
{
    if (GetKeyState(0x41) & 0x8000)
    { 
        std::cout << "a" << std::endl;
        while (GetKeyState(0x41) & 0x8000);
    }
}