c++ - 按下特定键时快速按下此键。如何防止触发键被按下?(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)); //
}
}
解决方案
您在循环中调用 GetAsyncKeyState() 。如果检测到按键是否被按下。它在按下键期间多次调用该函数。当您按下一个键时,通常会持续 5-25 毫秒,因此 GetASyncKeyState() 会多次检测按键。
GetASyncKeyState() 返回一个短整数,如果设置了最低有效位,则在之前对 GetASyncKeyState() 的调用中已经检测到密钥
要修复您的代码,只需使用按位运算符 AND 检查此位
if (GetAsyncKeyState(0x55) &1)
这在切换布尔值或特征时也很有用。
推荐阅读
- excel - 基于单元格值的工作簿名称
- android - SplashScreen API 与 WindowCompat setDecorFitsSystemWindows 清除窗口背景颜色
- javascript - 为什么对象构造函数属性是全局范围的?
- laravel - 主机名 localhost 不包括 laravel 多租户应用程序中的子域
- powershell - PowerShell 将源文件夹中的文件复制到匹配的目标失败并显示目标值
- python - 如何在pyqt5中嵌入绘图图?
- python - 如何使用 nltk.books 中的文本?
- php - 在 PHP 中记录 POST 数据
- hash - 是否有一个散列函数将相同间隔中的点分箱到相同的散列,所以我们可以在 O(1) 时间内识别包含间隔
- micro-frontend - 如何从 single-spa util 模块中导出功能并在 single-spa 微前端中导入相同的功能?