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编译器之间的debugging和发布模式之间进行切换,我厌倦了C和C ++。 在所有情况下都会发生同样的错误。
这个想法是这样的:热键是Control + 1.当用户同时按下Control键和1键时,我需要代码printf("Set grenades to 100!\n");
被跑。
但是,有一个错误。 如果用户按下并释放1键。 等待任何时间(秒,分钟),然后按下控制键, printf("Set grenades to 100!\n");
被执行。
即使用户按下键之间也会发生此错误。 例如: printf("Set grenades to 100!\n");
在用户执行以下操作时执行:
在第4步,代码被执行。 我该如何解决这个错误?
我想使用GetAsyncKeyState而不是GetKeyState,因为即使用户切换到另一个程序,也要捕获input。
关于GetAsyncKeyState()
的返回值,根据微软的说法, 如果设置了最高有效位 , 关键是关闭 。
这里重要的一点是:对于带符号的类型,比如short
, 当最高有效位被设置时 ,它被读作一个负数 。 GetAsyncKeyState()
返回short
。
这表明在您的代码中使用的逻辑来解释GetAsyncKeyState()
的结果与它在当前应用程序中需要的结果相反。 也就是说,你的条件陈述应该是检查负数而不是正数。
还有一点需要注意 :正如其他人所建议的, GetAsyncKeyState()
是检查密钥的状态。 但是它的返回值还包含确定最近是否按下键的信息。 事实上,通过查看LSB,你将会这样做。 在同一链接中,解释说LSB是最近状态的一个指标。但这不是一个推荐的做法。 最近的位状态可以由在另一个线程中运行的任何进程设置,因此只能谨慎使用。
所以,试试这个 。 我在64位的窗口上测试过,似乎没有问题,不管我先按了多少次,或者按下ctrl
键,弹出窗口都不会出现。 但是,当我同时按两个,然后弹出。
#include <stdio.h> #include <windows.h> //#include <stdbool.h>//I did not need this, you might. int main(void) { while (1) { if (GetAsyncKeyState(VK_CONTROL)<0) { if (GetAsyncKeyState('1')<0) { printf("Set grenades to 100!\n"); Sleep(200);//changed here for my test, you might need to change again } } Sleep(200);//changed here for my test, you might need to change again } return 0;//unreachable code warning }