【发布时间】:2013-11-05 07:13:58
【问题描述】:
main.c:
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
int main(void) {
while (true) {
if (GetAsyncKeyState(VK_CONTROL)) {
if (GetAsyncKeyState('1')) {
printf("Set grenades to 100!\n");
Sleep(500);
}
}
Sleep(100);
}
return 0;
}
我尝试在调试和发布模式之间、mingw 和 VS 编译器之间进行切换,但我对 C 和 C++ 都感到厌烦。在所有情况下都会发生相同的错误。
这个想法是让热键是 Control + 1。每当用户同时按下 Control 键和 1 键时,我希望运行代码 printf("Set grenades to 100!\n");。
但是,有一个错误。如果用户按下并释放 1 键。等待任意时间(秒、分钟),然后按下 Control 键,printf("Set grenades to 100!\n"); 被执行。
即使用户在两者之间按下键,也会发生此错误。例如:printf("Set grenades to 100!\n"); 会在用户执行以下操作时执行:
- 按 1 键。
- 释放 1 键。
- 按下并释放以下键:'H'、'i'、'S'、't'、'a'、'c'、'k'、'o'、'v'、'e'、 'r'、'f'、'l'、'o'、'w' 和 '2'。
- 按下并释放控制键。
在第 4 步,执行代码。如何修复此错误?
我想使用 GetAsyncKeyState 而不是 GetKeyState,因为我希望即使用户切换到另一个程序也能捕获输入。
【问题讨论】:
-
我不熟悉
GetAsyncKeyState,但复合if语句是否有效?if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState('1'))? -
我不想使用复合 if 语句,因为我有多个要使用的热键。 Control + 1、Control + 2、Control + 3 等...我会尝试看看是否修复了这个错误。
-
GetAsyncKeyState的结果应该用 0x8000 屏蔽以检查密钥是否已关闭(根据文档)。无论如何,可以使用RegisterHotKey设置热键。 -
即使我使用复合 if 语句,该错误似乎仍然存在。
-
GetAsyncKeyState回答了“这个键现在按下了吗?”的问题,而不是它们是否同时按下、中间是否按下了任何键或一只猫的问题在你的键盘上。如果您需要跟踪这些事情,您需要自己提供额外的逻辑或选择不同的输入处理方法。
标签: c++ c windows winapi hotkeys