VC实现向一个窗口发送 tab键 键盘事件

我所的这个窗口是一个游戏,我使用过这几种方法:1keybd_event(VK_TAB,0,0,0);keybd_event(VK_TAB,0,KEYEVENTF_KEYU... 我所的这个窗口是一个游戏,我使用过这几种方法:1
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
2
//::SendMessage(hwnd,WM_KEYDOWN,VK_TAB,0);
//::SendMessage(hwnd,WM_KEYUP,VK_TAB,0);
3
::PostMessage(hwnd,WM_KEYDOWN,VK_TAB,NULL);
::PostMessage(hwnd,WM_KEYUP,VK_TAB,NULL);
都是没有效果呀在其它的游戏中是有效果的,这个游戏根本反应呀
是不是被屏蔽了这些消息
还有其它的方法吗?请求高手指教。
展开
 我来答
ufo1cn
2011-08-31 · TA获得超过448个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:229万
展开全部
可能游戏采用的是比如DirectX中DirectInput等直接读取输入设备的技术。可以HOOK住DirectInput相关函数。 或编写键盘过滤驱动。这样来模拟DiectInput输入。
追问
HOOK住DirectInpu 什么意思? 怎样实现呢?
追答
下面是别人的回答
很抱歉,API Hook不等同于消息Hook,虽然都叫Hook,但有着本质的区别,也就没所谓全局和局部之分了。消息Hook是Windows提供给应用程序的一个正常的应用,而API,则是“利用”Windows的特性来达到的目的。
要Hook目标进程一个API,无非两种方法:利用PE文件的结构,把目标进程的每个可执行模块(包括exe和dll)中的导入表部分修改,把目标API的地址修改为你自己写的函数。这种方法以《Windows核心编程》的第22章介绍的挂接API的方法最为经典。
上种方法有个很大的弊端,就是如果目标进程已经在你的程序运行之前运行了,并且已经使用GetProcAddress得到了目标API的地址,这种方法就无用了,因为往后目标进程极有可能不会再去通过导入表来得到API的地址了。前段时间我做IE的socket的钩子,用到了另一种方法:
这种方法的前身是,把目标API的前5个字节修改为一个jmp跳转指令,直接跳到你的API里,接着你再把这5个字节写回去,然后再次用同样的参数去调用目标API,目标API返回之后再把那5个字节再回去(有点像缺页中断的处理过程)。这样在你就能拦截所有的对目标API的调用了。但是,这种方法的最大的缺点就是,对多线程来说效果不好。于是我就引出了另一种方法:当对目标API的调用导致的跳转到我的代码中后,不把那5个字节写回去,而是在你的API中,用汇编实现那5个字节原来的功能,之后直接跳转到目标API的第6个字节去运行,这样你的API就永远不会被漏掉了,而且只要你注意寄存器的保存与恢复,以及栈的平衡,这种方法就会很稳定。当然,这种方法会限于API版本的限制,不同的版本,开始的5个字节可能不一样,你就要分别对待了。

说了这么多废话,其中最核心的一点就是,把自己的代码注入到目标进程中,最简单的方法还是用Dll。当然,不用Dll的方法也有,比如罗云彬《Windows环境下32位汇编语言程序设计》中提到的那样,用汇编写——比Dll更麻烦。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式