mfc中模拟键盘控制游戏中的人物动作

时间:2021-07-26 00:35:23
if(strtemp=="s")
 {
 CWnd *pwnd = FindWindow("MARIO01","加油中国,自强不息!"); //希望找到资源管理器

if(pwnd->GetSafeHwnd()) 

pwnd->ShowWindow(SW_NORMAL); 
 pwnd->SetForegroundWindow(); 
 
keybd_event(90,MapVirtualKey(90,0),0,0);  
keybd_event(90,MapVirtualKey(90,0),KEYEVENTF_KEYUP,0); 
}
这段代码是 当接收到S,模拟键盘上的Z键,游戏人物发射炮弹。但实际中,人物没有任何反应,但是在txt文档中可以不断输出z。同时,如果去掉keybd_event(90,MapVirtualKey(90,0),KEYEVENTF_KEYUP,0); 这一句,游戏中的人物可以连续不断的发射炮弹。这就是说,可以模拟按键一直按下去不动,但是模拟不了按键按一下。还有的说用postmessage,但是在mfc中postmessage只有三个参数,没有第一个句柄的参数,所以我无法指定游戏窗口为当前窗口,无法实现对游戏人物的控制。研究了很久也不知道怎么回事!!求解答!!!

6 个解决方案

#1


类似的控制程序我都使用“状态机”模式,动作的每个状态都是被控的,所有的动作均由设计的触发状态决定。一条线的程序不符合面向对象的风格。

#2


注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

#3


引用 1 楼 wxhxj0268 的回复:
类似的控制程序我都使用“状态机”模式,动作的每个状态都是被控的,所有的动作均由设计的触发状态决定。一条线的程序不符合面向对象的风格。

什么是状态机,我第一次写这个程序,所以都是一步步摸索来的~~您能详细指导一下么

#4


引用 2 楼 zzz3265 的回复:
注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

我的程序里 第一个参数是虚拟码,第二个就是扫描码~都写了啊
而且我的程序中有个控制人物跳起的z键,在游戏中是可以控制的

#5


使用  api ::postmessge  not  mfc postmessage

#6


引用 4 楼 u013779868 的回复:
Quote: 引用 2 楼 zzz3265 的回复:

注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

我的程序里 第一个参数是虚拟码,第二个就是扫描码~都写了啊
而且我的程序中有个控制人物跳起的z键,在游戏中是可以控制的


又试了几次 发现真的是没加sleep 的原因~~多谢各位!!

#1


类似的控制程序我都使用“状态机”模式,动作的每个状态都是被控的,所有的动作均由设计的触发状态决定。一条线的程序不符合面向对象的风格。

#2


注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

#3


引用 1 楼 wxhxj0268 的回复:
类似的控制程序我都使用“状态机”模式,动作的每个状态都是被控的,所有的动作均由设计的触发状态决定。一条线的程序不符合面向对象的风格。

什么是状态机,我第一次写这个程序,所以都是一步步摸索来的~~您能详细指导一下么

#4


引用 2 楼 zzz3265 的回复:
注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

我的程序里 第一个参数是虚拟码,第二个就是扫描码~都写了啊
而且我的程序中有个控制人物跳起的z键,在游戏中是可以控制的

#5


使用  api ::postmessge  not  mfc postmessage

#6


引用 4 楼 u013779868 的回复:
Quote: 引用 2 楼 zzz3265 的回复:

注意两个问题
1. 两个keybd_event之间要加上延时
2. 不同程序判别按键用的方式可能不一样, 有虚拟键代码 或 扫描码 keybd_event 最好两个都写上

我的程序里 第一个参数是虚拟码,第二个就是扫描码~都写了啊
而且我的程序中有个控制人物跳起的z键,在游戏中是可以控制的


又试了几次 发现真的是没加sleep 的原因~~多谢各位!!