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种软件模拟键盘事件的检测区分的话,又要如何才能骗过游戏使它能接收到我们的模拟按键信息呢?鼠标模拟事件也是如此。
在此请教各位高手共同出谋划策。高分求助,可以另开贴奖分,虽然大家并不怎么看重奖分,但是还是要给的。
目前已经测试对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种软件模拟键盘事件的检测区分的话,又要如何才能骗过游戏使它能接收到我们的模拟按键信息呢?鼠标模拟事件也是如此。
在此请教各位高手共同出谋划策。高分求助,可以另开贴奖分,虽然大家并不怎么看重奖分,但是还是要给的。
解决方案 »
- 原来 VB6 真的可以 办到 Set A = B : A = B
- vb在用f1调用chm时,有些窗体上会死掉,什么都不出现。窗体死掉了
- VB实现,ACCESS数据库A的表1,导入到ACCESS数据库B的表2,表1表2结构都相同,有一个自动编号的字段,怎么办啊?
- 如何屏蔽文本框的光标?(保证给分)
- 关于报表设计器和数据绑定问题,急啊,在线等!!
- BT外挂有用吗?
- qq的问题
- vb中flag怎么用?下划线处flag=add,……=flag都什么意思?
- 请各位大侠看看下面的代码是否正确,每次都报错说我未找到方法或数据成员
- 先来先得分,简单的问题
- 怎样用VB函数来判断,两条直线是否相交?
- 如何获取所有局域网计算机名及其IP
若是要设定这三个按键的状态,则要呼叫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
这个问题我已经解决了。今天。特来送分。
特此感谢 Modest(塞北雪貂) --- (偶最欣赏楼主的分) 。虽然楼上这则源码基本无效。
最后。由于大家都没讨论。所以。我也不想多讨论了。不过出于行规。还是要透露一点解决这贴问题的方法的,文字不多: WinIO 。
需要更多的资料请自己在Google搜搜。虽然找到的资料还要自己进行深加工才能用。但是虽然世风日下。但是热心人还是很多的。B4潜水的。