~请教postmessage模拟键盘按键问题~ ( 积分: 150 )

  • 主题发起人 主题发起人 hbh1
  • 开始时间 开始时间
H

hbh1

Unregistered / Unconfirmed
GUEST, unregistred user!
请问有的网络游戏是不是会拦截postmessage的消息的?<br>我想通过postmessage发送键盘信息到网游(1)那实现自动按快捷键吃药,发送了却在游戏里没反映的(但当鼠标指到游戏聊天框那却能打出字符)?<br>我是这样写的:发送按1的消息:<br>postMessage(aHandle,WM_keydown,49,0);<br>Sleep( 50 ); <br>postMessage(aHandle,WM_keyUP,49,0);<br><br>跟着我找来另一个类型相似的 网游(2)试以上方法,却可以成功模拟。<br><br>还有,后来我又用keybd_event试试,我这样发送:<br>keybd_event(49, 0, 0, 0);<br>Sleep( 50 ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>keybd_event(49, 0, KEYEVENTF_KEYUP, 0); <br>结果:网游(1)没反映,没有实现到按快捷键吃药,但当鼠标指到游戏聊天框那却能打出字符'1'来。又用网游(2)试试,可以成功吃药。<br><br>跟着改一改keybd_event的代码,改为:<br>keybd_event(49, MapVirtualKey(49,0), 0, 0);<br>Sleep( 50 ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>keybd_event(49, MapVirtualKey(49,0), KEYEVENTF_KEYUP, 0);<br>结果:网游(1)可以成功模拟按快捷键了<br><br><br>我想请教的是怎么用postmessage在网游(1)实现模拟按键,有办法解决吗?<br>因为keybd_event不好用,keybd_event只能用在最上面的窗口,不能最小化窗口。谢谢!<br><br>如果可以的话欢迎联系指教 QQ:99771755 &nbsp; 万分感谢!
 
请问有的网络游戏是不是会拦截postmessage的消息的?<br>我想通过postmessage发送键盘信息到网游(1)那实现自动按快捷键吃药,发送了却在游戏里没反映的(但当鼠标指到游戏聊天框那却能打出字符)?<br>我是这样写的:发送按1的消息:<br>postMessage(aHandle,WM_keydown,49,0);<br>Sleep( 50 ); <br>postMessage(aHandle,WM_keyUP,49,0);<br><br>跟着我找来另一个类型相似的 网游(2)试以上方法,却可以成功模拟。<br><br>还有,后来我又用keybd_event试试,我这样发送:<br>keybd_event(49, 0, 0, 0);<br>Sleep( 50 ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>keybd_event(49, 0, KEYEVENTF_KEYUP, 0); <br>结果:网游(1)没反映,没有实现到按快捷键吃药,但当鼠标指到游戏聊天框那却能打出字符'1'来。又用网游(2)试试,可以成功吃药。<br><br>跟着改一改keybd_event的代码,改为:<br>keybd_event(49, MapVirtualKey(49,0), 0, 0);<br>Sleep( 50 ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>keybd_event(49, MapVirtualKey(49,0), KEYEVENTF_KEYUP, 0);<br>结果:网游(1)可以成功模拟按快捷键了<br><br><br>我想请教的是怎么用postmessage在网游(1)实现模拟按键,有办法解决吗?<br>因为keybd_event不好用,keybd_event只能用在最上面的窗口,不能最小化窗口。谢谢!<br><br>如果可以的话欢迎联系指教 QQ:99771755 &nbsp; 万分感谢!
 
有人懂吗?谢谢指教
 
根据你的情况分析,发送消息之所以不成功,最有可能的原因是你所查找到的窗口句柄是错误的.<br>在我们实际开发中,这也是出现采用模拟按键函数目标程序能接收动作,而采用发送消息函数目标程序却不能正确动作的原因.<br>从你所提供的几种现象,都可印证我这种看法.<br>将鼠标指像聊天栏内时,可收到消息,说明网游1并不会像你说的那样拦截这个按键消息,事实上也无必要甚至无可能拦截.你将鼠标指向聊天栏的时候,也许是网游1将聊天栏窗口激活成了键盘焦点,而你的发送消息函数中的句柄,正是这个聊天栏的窗口句柄.键盘模拟函数使用时系统是会像每一进程都发送这个消息的.<br><br>解决办法:<br>1.通过系统进程找到此进程句柄,而不是用findwindow函数查找窗口句柄.//此方法经我们采用有效<br>2.发送广播消息.//未经验证.
 
zfg886,你好,<br>开始我也这样认为,但我将那个网游的全部句柄列出来了,只有一个主窗口句柄,其他句柄我也试过发同样的消息没反映,是不是拦截了虚拟按键消息?你再仔细看看我上面的测试结果,还有一点,用sendmessage发送消息到聊天框没字母打出来 也不能实现快捷键功能;<br><br><br>问过某些人说:‘有些游戏用了GetKeyState这个涵数验证是按键是否按下,他说要用apihook来hook这个函数做修改’
 
首先可以明确一点.任何游戏设计人员不会去采用GetKeyState函数来检查按下了什么键.原因:虚拟键那么多,而这个函数一次只能获取一个指定虚拟键的状态.又怎么可能去用这个函数来判断呢?既然不能实时监控,那就只能在某键按下的时候来检测了,但是,前提是要收到了某键按下的消息.反过来,等收到消息也就是网游程序知道按键动作的时候,这个动作已经成为过去.而此时再调用GetKeyState去检测,获到的虚拟键状态已经不是所希望的时候的了.所以要用API HOOK 这个函数的说法绝对是错误的,没经理论推敲和实际检测的说法.<br><br>如果实在找不出原因,我建议你用两个不同的钩子,截取消息,自定义一个消息值.然后用另一个进程对这个网游发这个自定义的消息,看这个网游能否收到你这个消息.两个钩子的类型:一个为系统级钩子,在网游没启动之前即HOOK,一个线程钩子,在网游完全启动后HOOK.这样做的目的是确定这个网游是否真的阻止了消息的传递.因为最先HOOK的系统级钩子在消息链中得到消息的是在最后.而最后HOOK的线程钩子则可以最先得到消息.<br><br>只有一个主窗口句柄----这句话我没明白你的意思.不过还是建议不要去查找窗口的句柄,而是查找进程的句柄.进程的句柄是通过枚举当前进程,得到进程ID,然后再通过<br> &nbsp;GetWindowThreadProcessId函数获取其句柄.
 
任何游戏设计人员不会去采用GetKeyState函数来检查按下了什么键<br><br>这句话声明下,适用的范围特指本例一些情况.
 
'GetWindowThreadProcessId函数获取其句柄. '<br><br>你的意思是向GetWindowThreadProcessId函数获取的句柄postmessage吗?<br>是以下这样吗:<br>AHandle:=findwindow(nil,'游戏');<br>QQ:=GetWindowThreadProcessId(ahandle,pid);<br>postMessage(QQ,WM_keydown,95,0);<br>是这个意思吗?
 
不是,不能用findwindow来获取句柄,得先遍历进程,得到进程ID,然后用<br>QQ:=GetWindowThreadProcessId(nil,id);<br><br>得到句柄qq
 
之所以要这样做,主要是因为一般的游戏都是多线程的.你像一个窗口发消息,并不能使所有的线程都得到你这个消息.
 
QQ:=GetWindowThreadProcessId(nil,id);<br><br>这样不通过编译啊,zfg886 能联系我讨论一下吗?thx!<br>QQ:99771755
 
SendMessage(btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0); <br>SendMessage(btnWnd,WM_LBUTTONUP,0,0); <br><br>注:btnWnd为按钮的句柄
 
我上面的nil是在这里随便打的,只是表示此值传入的为空,实际上这里应该是个变量了.
 
多人接受答案了。
 
后退
顶部