键盘模拟

键盘模拟

最近下载了《红警3:起义》,发现一个问题:不能连续用键盘按键。于是在制造装备时只能不停的点击鼠标。或者不停的按键盘的快捷键——而且每按下一次键必须松开,不能按下不放。于是想写一个程序,在按下相应键时,向指定窗口模拟发送消息,以造成不停按下、松开的效果。
在写程序之前,先了解一下键盘的几个消息:WM_KEYDOWN/WM_KEYUP/WM_CHAR。
1.键盘的两个消息:
a.WM_KEYDOWN:键盘按下时发送的消息。
b.WM_KEYUP:键盘松开时的消息。
应用程序中,应用的发生就是在这两个消息的处理过程。有时是在WM_KEYDOWN中,此时只要按下键盘事件就会发生;有时在WM_KEYUP中,此时要等到键盘松开才会发生事件。由于大部分程序只是在两个消息中的一个处理事情,另一个不用(缺省处理),所以对以这种消息的模拟只要模拟处理事件的那个消息就可以,至于另一个消息就可以免了。

2.模拟的几种方法。
a.keybd_event 专门为键盘模拟设置的函数。 
b.SendInput
c.SendMessage发送消息

3.应用程序中几种判断键盘的方法。
a.在消息处理时调用函数GetKeyState/GetAsyncKeyState等来查看指定的虚拟码是否为按下还是松开。
b.为了防止键的连续按下,判断WM_KEYDOWN的lParam的第30位,为1时是连按;为0则不是。
c.使用一个变量在WM_KEYUP是清除;在第一个WM_KEYDOWN时设置,以后所有的WM_KEYDOWN先判断变量是否已经被清除,否则不进行后面的处理。

4.键盘消息的截获
a.窗口的子类化。使用函数SetWindowLong(GWL_WNDPROC)使所有的消息通过指定的函数。
b.键盘消息钩子。SetWindowsHookEx可以使所有的键盘的消息COPY一份至指定函数。注意是COPY,而不是拦截。你可以在函数中知道当前发送的消息类型。以便采取相应的对策。

5.代码注入的方法
a.可以使用钩子将DLL注入到其他进程中。
b.可以使用创建远程线程CreateRemoteThread的方法。

6.在编程的过程中发现的几个问题。
a.最好不要使用PostMessage来模拟键盘消息。参见:http://blogs.msdn.com/oldnewthing/archive/2005/05/30/423202.aspx
b.远程线程的加载Delphi编写DLL时要注意这些DLL可能不稳定。参见:http://www.mustangpeak.net/hooks_fix.htm
c.写好了程序在《红警3:起义》中可以使用了,但是在《红警3》中却不能使用。原来它使用了DirectInput绕过了消息,它根本不处理键盘消息,对于DirectInput你只能在驱动级动脑筋了。

7.参考文献
a.向其他进程注入代码的三种方法 http://dev.csdn.net/Develop/article/28/68354.shtm

你可能感兴趣的:(键盘模拟)