【发布时间】: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。