如何向 DirectX 的 DirectInput 检测输入的区域发送模拟的键盘信息?

jessezappy 2006-04-25 12:56:05
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种软件模拟键盘事件的检测区分的话,又要如何才能骗过游戏使它能接收到我们的模拟按键信息呢?

鼠标模拟事件也是如此。
在此请教各位高手共同出谋划策。高分求助,可以另开贴奖分,虽然大家并不怎么看重奖分,但是还是要给的。

...全文
1542 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
迈克揉索芙特 2007-04-27
  • 打赏
  • 举报
回复
晕,这分得的不光彩啊。
bingtuohun 2007-04-27
  • 打赏
  • 举报
回复
QQ;44269597
bingtuohun 2007-04-27
  • 打赏
  • 举报
回复
我想问怎么模拟 光标上下左右,
我模拟都是2468这几个数字
jessezappy 2006-05-07
  • 打赏
  • 举报
回复
唉。。不知道最近CSDN的人气不行还是5.1放假大家不在家?这样的问题居然没人参与讨论。。巨寒。。世风日下??
这个问题我已经解决了。今天。特来送分。
特此感谢 Modest(塞北雪貂) --- (偶最欣赏楼主的分) 。虽然楼上这则源码基本无效。
最后。由于大家都没讨论。所以。我也不想多讨论了。不过出于行规。还是要透露一点解决这贴问题的方法的,文字不多: WinIO 。
需要更多的资料请自己在Google搜搜。虽然找到的资料还要自己进行深加工才能用。但是。。。虽然世风日下。但是热心人还是很多的。B4潜水的。
迈克揉索芙特 2006-04-25
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20001027/17/36845.html
迈克揉索芙特 2006-04-25
  • 打赏
  • 举报
回复
若只是要取得这三个按键(NumLock/CapsLock/ScrollLock)的状态,只要呼叫GetKeyStateAPI就可以了!
若是要设定这三个按键的状态,则要呼叫GetKeyboardState及SetKeyboardState二个API!

在表单的声明区中,加入以下的声明及模组:

PrivateDeclareFunctionGetKeyStateLib"user32"(ByValnVirtKeyAsLong)AsInteger
PrivateDeclareFunctionGetKeyboardStateLib"user32"(pbKeyStateAsByte)AsLong
PrivateDeclareFunctionSetKeyboardStateLib"user32"(lppbKeyStateAsByte)AsLong

PrivateSubSetKeyState(intKeyAsInteger,fTurnOnAsBoolean)
'取得键盘目前的状态,设定您想设定的任意键,再将其他键还成之前的状态,只改变一个键值
DimabytBuffer(0To255)AsByte
GetKeyboardStateabytBuffer(0)
abytBuffer(intKey)=CByte(Abs(fTurnOn))
SetKeyboardStateabytBuffer(0)
EndSub

FunctionGetCapslock()AsBoolean
'返回Capslock的状态
GetCapslock=CBool(GetKeyState(vbKeyCapital)And1)
EndFunction

FunctionGetNumlock()AsBoolean
'返回Numlock的状态
GetNumlock=CBool(GetKeyState(vbKeyNumlock)And1)
EndFunction

FunctionGetScrollLock()AsBoolean
'返回ScrollLock的状态
GetScrollLock=CBool(GetKeyState(vbKeyScrollLock)And1)
EndFunction

SubSetCapslock(ValueAsBoolean)
'设定Capslock的状态
CallSetKeyState(vbKeyCapital,Value)
EndSub

SubSetNumlock(ValueAsBoolean)
'设定Numlock的状态
CallSetKeyState(vbKeyNumlock,Value)
EndSub

SubSetScrollLock(ValueAsBoolean)
'设定ScrollLock的状态
CallSetKeyState(vbKeyScrollLock,Value)
EndSub
实际运用的方式如下:

PrivateSubCommand1_Click()
SetScrollLockTrue'设定ScrollLock为On
EndSub

PrivateSubCommand2_Click()
MsgBox"ScrollLock:"&GetScrollLock'取得ScrollLock状态
EndSub
jessezappy 2006-04-25
  • 打赏
  • 举报
回复
不知道用SetKeyboardState能不能有用,可是我刚刚搜索并测试了一下用 SetKeyboardState 控制 NumLock / CapsLock / ScrollLock 3个键的代码,均为无效。连我的键盘灯都控制不了。。。。
jessezappy 2006-04-25
  • 打赏
  • 举报
回复
这个贴我早先就搜到看过了。就是不知道“可以编一个程序,首先创建一个线程,用于模拟键盘和鼠标的输入”中的模拟要如何实现。。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧