问题描述:
MFC中使用钩子见识键盘消息,当截获到键盘消息满足一定条件后,屏蔽掉原有的按键消息,使用keybd_event发送虚拟的按键消息,例如游戏人物前 后左右移动的w a s d按键,使用shift + w a s d 可以加速运动,实测发现确实能截获键盘消息,也能使用keybd_event发送出来的虚拟按键消息,但问 题是,当抬起按键后,游戏人物角色不能立刻停止,还会有一定的延迟,且按下的时间越长,延迟越久。
【原因分析】根据题主的描述,大概是用键盘控制游戏角色的运动起始和停止。那么导致这个延迟的主要有两个原因:1、当keybd_event模拟按键被按下,就会持续向消息队列发送按键消息。跟物理键盘不一样的是,通过keybd_event发送按键消息不需要通过中断等处理,直接发给消息队列,所以会在消息队列里填充大量的按键消息,即使使用keybd_event发送键盘抬起消息,仍然需要很长时间去执行消息队列里的消息。所以按下的时间越长,延迟就越久。
2、题主在用键盘控制角色停止时,从操作键盘到系统处理中断,再到程序截获消息,中间是有一定的时间间隔的。即使这个时间间隔很小,keybd_event在此期间也能发出多个按键消息。
【解决方案】如果题主更真实地模拟键盘输入,让输入更加受控,可以简单地进行重复按键按下和抬起,并且在按下和抬起之间插入一段时间的休眠,应该能解决问题。
建议使用底层键盘全局钩子试试,前不久本人刚写过关于“鼠标键盘锁”的文章,具体可参考本人博客(目前收费)
除了鼠标被屏蔽外,还可以屏蔽键盘(包括Ctrl+Alt+Del、Win+L等系统键)
链接:https://blog.csdn.net/wlwdecs_dn/article/details/114081337
整个工程的下载地址:https://blog.csdn.net/wlwdecs_dn/article/details/114107420
购买了专栏,专栏里所有文章都可见,工程代码也可下载
运行时请添加360白名单,或者暂停360保护,代码都可以看到且自己编译生成,不用担心安全问题
望采纳
有个键盘缓冲区。当你按下按键不动,缓冲区会存储一定数量你按下的按键。
scanf("%*[^\n]");读入不是换行符的字符串,不保存,返回
scanf("%*c"); 读入一个字符,不保存,返回
这俩句代码的意思是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。