为了账号安全,请及时绑定邮箱和手机立即绑定

为什么将“ESCAPE”改为“SHIFT”之后,程序又恢复正常了?

为什么将“ESCAPE”改为“SHIFT”之后,程序又恢复正常了?

C++
www说 2022-05-31 14:10:36
使用do while语句。while(GetKeyState(VK_ESCAPE)>0);判断是否按下“ESCAPE”,如果按下则跳出循环,否则继续循环。第一次编译通过,程序无任何异常,可以正常使用。可是转天再进行编译,不进行任何修改,出现问题,循环只执行一次。while语句基本失效,程序不进行判断,直接执行一次后结束。可是,将“ESCAPE”改为“SHIFT”之后,程序又恢复正常了。很诧异,为什么程序放了一天就出了问题,还是说,当前"ESCAPE"一直处于按下的状态。使用vs2010编译。
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

GetKeyState() 是会出现这样的问题。
按理,需要调2次,用它的状态来判断键按下了,键又抬起了,这才完成了1次按键全过程。
程序如下:
#include <windows.h>#include <iostream>using namespace std;#include <stdio.h>#pragma comment (lib, "User32.lib")
main(){int flag=0,v;do{ if (flag==0)while(1){ v=GetKeyState(VK_ESCAPE);if (v >0) {printf("%#x ",v);flag=1; break;}};if (flag==1)while(1){ v=GetKeyState(VK_ESCAPE);if (v ==0) {flag=2; break;}};if (flag==2) break; } while(1);cout << "Esc pressed." << endl; return 0;}
实际上有时是这样,有时不是这样。原因不详。

也许不能简单地用 do while,而要写完整的 API 程序,在
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
。。。
switch (message){
在这里 处理消息
}
}

如果你不是做作业,而是为了实用,那么不如直接用 getch(),返回 0x001b 就是 ESC.
#include <stdio.h>#include <stdlib.h>#include <conio.h>main( ){ int key;
while(1){
if (!kbhit()){// printf("do whatever...\n"); 做其他的事} else {key = getch(); if (key==0x001b){printf("ESC key"); break;};};}return 0;}


查看完整回答
反对 回复 2022-06-06
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

可以使用 while ((nret = GetKeyState(VK_ESCAPE)) > 0); 这样可以在debug中查看nret的值

查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号