键盘模拟2
昨天说到《红警3》的连续按键不能用传统的方法模拟,因为它是使用了DirectInput,这绕过了消息队列。
一般情况下我们连续按住一个键,产生的消息是: WM_KEYDOWN——WM_KEYDOWN——...WM_KEYDOWN——WM_KEYUP。(注意忽略了WM_CHAR,可能在每个WM_KEYDOWN后面有一个WM_CHAR消息)。而如果我将这些消息修改成WM_KEYDOWN——WM_KEYUP——WM_KEYDOWN——WM_KEYUP...WM_KEYDOWN——WM_KEYUP,不就想了吗。(只有一部分处理WM_KEYUP消息的程序受影响)。
那么如何修改键盘的消息呢,哈哈,你可以查看《ROOTKITS--WINDOWS内核的安全防护》这本书,该书的第6章专门有一节介绍如何在驱动上截获键盘的。
下面是如何修改键盘消息的代码,其实很简单。
...
if (pIoStackLocation->Parameters.Read.Length >= sizeof(KEYBOARD_INPUT_DATA))
{
pInputData = (PKEYBOARD_INPUT_DATA)pirp->AssociatedIrp.SystemBuffer;
if (pInputData->MakeCode == PriorMakeCode) //如果按键的机器码和上次一样的话
if (pInputData->Flags == PriorFlags) //如果按键上次一样的话,即都是按下或弹起
if (PriorFlags == 0) //如果上次是按下的话
pInputData->Flags = 1; //这次就改成弹起
PriorMakeCode = pInputData->MakeCode;
PriorFlags = pInputData->Flags;
}
...
这样就可以解决因为DirectInput而不能连接按键的情况了。
参考书籍:
1.ROOTKITS--WINDOWS内核的安全防护
键盘模拟2
最新推荐文章于 2015-09-08 13:53:47 发布
439

被折叠的 条评论
为什么被折叠?



