|
|
发表于 2023-10-11 07:34:10
|
显示全部楼层
在Windows环境下,GetKeyState函数可以用来检测键盘的按键状态,包括当窗口失去焦点时的按键状态。但是,GetKeyState函数会持续检测按键状态,即使按键已经被按下并释放,只要没有其他键被按下,它仍然会返回按键被按下的状态。这就是你在使用GetKeyState函数时,如果持续按键,变量会一直增加的原因。
要实现和getch一样的效果,即只在按键被按下的那一刻检测到按键,可以使用Windows的消息队列。当一个按键被按下时,Windows会将一个消息放入消息队列,你可以使用GetMessage或PeekMessage函数来获取这个消息。然后,你可以使用TranslateMessage和DispatchMessage函数来处理这个消息。
以下是一个使用消息队列来检测按键的示例代码:
- #include <stdio.h>
- #include <windows.h>
- void main() {
- MSG msg;
- int anjian_d = 0;
- int anjian_f = 0;
- int anjian_j = 0;
- int anjian_k = 0;
- int anjian_sum = 0;
- while (1) {
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- if (msg.message == WM_KEYDOWN) {
- switch (msg.wParam) {
- case 'd':
- case 'D':
- anjian_d++;
- break;
- case 'f':
- case 'F':
- anjian_f++;
- break;
- case 'j':
- case 'J':
- anjian_j++;
- break;
- case 'k':
- case 'K':
- anjian_k++;
- break;
- }
- system("cls");
- anjian_sum = anjian_d + anjian_f + anjian_j + anjian_k;
- printf("d:%d\
- f:%d\
- j:%d\
- k:%d\
- sum:%d\
- ", anjian_d, anjian_f, anjian_j, anjian_k, anjian_sum);
- }
- }
- }
- }
复制代码
这段代码会创建一个消息循环,不断地从消息队列中取出消息并处理。当检测到一个按键被按下的消息时,它会增加相应的计数器,并更新显示的按键计数。
请注意,这段代码只能在Windows环境下运行,因为它使用了Windows的消息队列。在其他操作系统下,你可能需要使用不同的方法来检测按键。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案 |
|