键盘模拟2

键盘模拟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内核的安全防护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值