首页 > 解决方案 > 按下特定键时快速按下此键。如何防止触发键被按下?(c++)

问题描述

如果标题不清楚,我很抱歉.. buuut 我不知道如何缩短内容:c 如果按下/发送键“U”,下面的(提取)代码应该快速按下/发送键“A” . 但是如果我按'U',它会先发送'U',然后是几个'A'。我怎样才能使它根本不发送密钥'U'?我尝试了不同的东西,但我无法让它工作......我认为问题在于 if 条件:/

INPUT ip; // Structure for creating keyboard-events
ip.type = INPUT_KEYBOARD; // Create a generic keyboard-event
ip.ki.wScan = 0;       // Hardware-Scan-Code for the key
ip.ki.time = 0;        //
ip.ki.dwExtraInfo = 0; //

for (;;) {
    sleep_for(milliseconds(1)); // Sleep in each iteration so the CPU / RAM have a relaxed life
    if (GetAsyncKeyState(0x55)) {   // If key 'U' is pressed
        ip.ki.wVk = 0x41;                 // Press key 'A'
        ip.ki.dwFlags = 0;                //
        SendInput(1, &ip, sizeof(INPUT)); //

        ip.ki.dwFlags = KEYEVENTF_KEYUP;    // Release key that was pressed
        SendInput(1, &ip, sizeof(INPUT));   //
    }
}

标签: c++keyboardkeysignals

解决方案


您在循环中调用 GetAsyncKeyState() 。如果检测到按键是否被按下。它在按下键期间多次调用该函数。当您按下一个键时,通常会持续 5-25 毫秒,因此 GetASyncKeyState() 会多次检测按键。

GetASyncKeyState() 返回一个短整数,如果设置了最低有效位,则在之前对 GetASyncKeyState() 的调用中已经检测到密钥

要修复您的代码,只需使用按位运算符 AND 检查此位

if (GetAsyncKeyState(0x55) &1)

这在切换布尔值或特征时也很有用。


推荐阅读