1.目前几乎多有的游戏在控制区都是采用DirectInput来捕获键盘按键信息,如果想自己编写一个模拟键盘程序或者使用按键精灵脚本来控制游戏区的话,经过几次试验,证明是不可行的,DirectInput不能接受到模拟的按键信息,至于问题种为什么要说“区域”两个字,是因为在游戏的聊天区模拟按键信息是生效的。
目前已经测试对DirectInput无效的函数为:
A.Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
B.Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
C.Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
D.还有VB里面的 SendKeys 语句。
以上4种方法在游戏的聊天区是生效的。
因此构想,能否做到硬件级的键盘模拟事件呢?比如强行写键盘缓冲区?来使得 DirectInput 能接受到我们模拟的按键信息呢?2.如果游戏区(聊天区是可以正常接受模拟事件的)已加入了硬件事件和上述4种软件模拟键盘事件的检测区分的话,又要如何才能骗过游戏使它能接收到我们的模拟按键信息呢?鼠标模拟事件也是如此。
在此请教各位高手共同出谋划策。高分求助,可以另开贴奖分,虽然大家并不怎么看重奖分,但是还是要给的。

解决方案 »

  1.   

    http://topic.csdn.net/t/20001027/17/36845.html
      

  2.   

    不知道用SetKeyboardState能不能有用,可是我刚刚搜索并测试了一下用 SetKeyboardState 控制  NumLock / CapsLock / ScrollLock  3个键的代码,均为无效。连我的键盘灯都控制不了。
      

  3.   

    若只是要取得这三个按键(NumLock/CapsLock/ScrollLock)的状态,只要呼叫GetKeyStateAPI就可以了!
    若是要设定这三个按键的状态,则要呼叫GetKeyboardState及SetKeyboardState二个API!在表单的声明区中,加入以下的声明及模组:PrivateDeclareFunctionGetKeyStateLib"user32"(ByValnVirtKeyAsLong)AsInteger
    PrivateDeclareFunctionGetKeyboardStateLib"user32"(pbKeyStateAsByte)AsLong
    PrivateDeclareFunctionSetKeyboardStateLib"user32"(lppbKeyStateAsByte)AsLongPrivateSubSetKeyState(intKeyAsInteger,fTurnOnAsBoolean)
    '取得键盘目前的状态,设定您想设定的任意键,再将其他键还成之前的状态,只改变一个键值
    DimabytBuffer(0To255)AsByte
    GetKeyboardStateabytBuffer(0)
    abytBuffer(intKey)=CByte(Abs(fTurnOn))
    SetKeyboardStateabytBuffer(0)
    EndSubFunctionGetCapslock()AsBoolean
    '返回Capslock的状态
    GetCapslock=CBool(GetKeyState(vbKeyCapital)And1)
    EndFunctionFunctionGetNumlock()AsBoolean
    '返回Numlock的状态
    GetNumlock=CBool(GetKeyState(vbKeyNumlock)And1)
    EndFunctionFunctionGetScrollLock()AsBoolean
    '返回ScrollLock的状态
    GetScrollLock=CBool(GetKeyState(vbKeyScrollLock)And1)
    EndFunctionSubSetCapslock(ValueAsBoolean)
    '设定Capslock的状态
    CallSetKeyState(vbKeyCapital,Value)
    EndSubSubSetNumlock(ValueAsBoolean)
    '设定Numlock的状态
    CallSetKeyState(vbKeyNumlock,Value)
    EndSubSubSetScrollLock(ValueAsBoolean)
    '设定ScrollLock的状态
    CallSetKeyState(vbKeyScrollLock,Value)
    EndSub
    实际运用的方式如下:PrivateSubCommand1_Click()
    SetScrollLockTrue'设定ScrollLock为On
    EndSubPrivateSubCommand2_Click()
    MsgBox"ScrollLock:"&GetScrollLock'取得ScrollLock状态
    EndSub
      

  4.   

    唉。。不知道最近CSDN的人气不行还是5.1放假大家不在家?这样的问题居然没人参与讨论。。巨寒。。世风日下??
    这个问题我已经解决了。今天。特来送分。
    特此感谢 Modest(塞北雪貂) --- (偶最欣赏楼主的分) 。虽然楼上这则源码基本无效。
    最后。由于大家都没讨论。所以。我也不想多讨论了。不过出于行规。还是要透露一点解决这贴问题的方法的,文字不多: WinIO 。
    需要更多的资料请自己在Google搜搜。虽然找到的资料还要自己进行深加工才能用。但是虽然世风日下。但是热心人还是很多的。B4潜水的。