【问题标题】:Quickly press this key when a specific key is pressed. How prevent the trigger key to be pressed? (c++)按下特定键时快速按下此键。如何防止触发键被按下? (c++)
【发布时间】:2020-06-21 16:19:49
【问题描述】:

如果标题不清楚,我很抱歉.. 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));   //
    }
}

【问题讨论】:

  • sleep_for(milliseconds(1)) - 红旗。 sleep(的任何变体)很少有效使用。通常这是一个错误。为什么你认为你需要sleep?如果您只是想减少 CPU 使用,更好的选择是异步 API 和回调函数。
  • @JesperJuhl 我已经在我的电脑上对其进行了测试,发现当我在这个无限循环中没有睡眠时,这个程序会占用我 20% 的 CPU / RAM 并使我的电脑非常响亮。 .. 但是一旦我在那里设置了一个小睡眠定时器,一切都很好,成本低于 1% :)
  • 但是您应该做的是忙于循环并让进程进入睡眠状态。您应该使用让程序休眠直到发生某些事情将其唤醒的 API。你这样做是不对的。您在本应睡觉时轮询,等待异步回调。在需要完成工作的情况下,您的睡眠会增加延迟,而您的循环会在不需要完成工作时浪费时间。两全其美。
  • 阅读事件循环。
  • 为了帮助您进行研究,Microsoft 使用了术语 Message Loop

标签: c++ keyboard key signals


【解决方案1】:

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

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

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

if (GetAsyncKeyState(0x55) &1)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多