模拟键盘输入超难问题,不信在CSDN解决不了!

xionghonge 2004-04-29 03:57:20
向游戏模拟发送CTRL+R键,但SendKeys和keybd_event都被该游戏屏蔽了,
但“按键精灵”(一种模拟按键软件)模拟的操作可被该游戏接受!
...全文
101 26 点赞 打赏 收藏 举报
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
道素 2004-05-08
这个DirectInput俺还真没查过,从来没涉及过这方面编程,现在查查
  • 打赏
  • 举报
回复
xionghonge 2004-05-05
up
  • 打赏
  • 举报
回复
cupidvenus 2004-05-01
gz
  • 打赏
  • 举报
回复
luoxiaoxiang 2004-05-01
“向游戏模拟发送CTRL+R键,但SendKeys和keybd_event都被该游戏屏蔽了”
不可能吧?是不是搞错了?
  • 打赏
  • 举报
回复
captainivy 2004-04-30
关注~
  • 打赏
  • 举报
回复
xionghonge 2004-04-30
能不能给postmessage按组合键的例子!谢谢!
  • 打赏
  • 举报
回复
pigpag 2004-04-30
The Power of DirectInput
Apart from providing services for devices not supported by the Microsoft Win32API, DirectInput gives faster access to input data by communicating directly with the hardware drivers rather than relying on Microsoft Windows messages.

就是这个DirectInput搞的鬼啦……不过我找不到在DirectInput里面插输入的函数
  • 打赏
  • 举报
回复
ljf88888 2004-04-30
关注!呵呵!节日快乐!
  • 打赏
  • 举报
回复
pigpag 2004-04-30
//如果这个还不行,我就不知道是什么原因了,查看MSDN,相关的api仅仅有
DirectInput的函数查过没有?
  • 打赏
  • 举报
回复
道素 2004-04-30
如果这个还不行,我就不知道是什么原因了,查看MSDN,相关的api仅仅有
ActivateKeyboardLayout
BlockInput
EnableWindow
GetActiveWindow
GetAsyncKeyState
GetFocus
GetKeyboardLayout
GetKeyboardLayoutList
GetKeyboardLayoutName
GetKeyboardState
GetKeyNameText
GetKeyState
GetLastInputInfo
IsWindowEnabled
keybd_event
LoadKeyboardLayout
MapVirtualKey
MapVirtualKeyEx
OemKeyScan
RegisterHotKey
SendInput
SetActiveWindow
SetFocus
SetKeyboardState
ToAscii
ToAsciiEx
ToUnicode
ToUnicodeEx
UnloadKeyboardLayout
UnregisterHotKey
VkKeyScan
VkKeyScanEx
不过我刚才下载了按键精灵,并且用spy++看它发送的消息,我发现它是用postmessage发送
WM_HotKey消息
  • 打赏
  • 举报
回复
xionghonge 2004-04-30
感谢!节日快乐!
  • 打赏
  • 举报
回复
道素 2004-04-30
看来节前我是帮不上忙了,抱歉
  • 打赏
  • 举报
回复
道素 2004-04-30
你进展比我大
今天放假,没想到今天还挺忙
我刚才试了一下在vb中用postmessage发送WM_Hotkey但是不能达到预期效果
而且用spy++并没有发现它发送出WM_Hotkey消息,而是WM_Command之类的,看来我的写法不对

你也可以用spy++检视一下,至于常数是多少先不用管,先用spy++从按键精灵的消息中搞出WM_HOTKEY的消息参数,你原样用vb发送看看效果

还有即使原来不行的api你要考虑每个按键是两个消息,不过你如果已经在游戏以外成功了,可能这点可以跳过这点

  • 打赏
  • 举报
回复
xionghonge 2004-04-30
研究了一上午postmessage按ALT组合键能实现,CTRL组合键找不到相关常数!
我在这里等,等到你研究出结果!
  • 打赏
  • 举报
回复
道素 2004-04-30
一会我试试,看看可否实现,如果今天搞补丁就要等5。8以后了
放假时我不上网
  • 打赏
  • 举报
回复
xionghonge 2004-04-29
程序终于搞懂,也运行正常,在IE中通过测试。
但遗憾的是:对游戏仍然无效!!!!
对游戏仍然无效!!!!
对游戏仍然无效!!!!
对游戏仍然无效!!!!
Private Sub Timer1_Timer()

Dim GInput(0 To 3) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = VK_CONTROL
KInput.dwFlags = 0
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput)

KInput.wVk = VK_R
KInput.dwFlags = 0
GInput(1).dwType = INPUT_KEYBOARD
CopyMemory GInput(1).xi(0), KInput, Len(KInput)

KInput.wVk = VK_R
KInput.dwFlags = KEYEVENTF_KEYUP
GInput(2).dwType = INPUT_KEYBOARD
CopyMemory GInput(2).xi(0), KInput, Len(KInput)

KInput.wVk = VK_CONTROL
KInput.dwFlags = KEYEVENTF_KEYUP
GInput(3).dwType = INPUT_KEYBOARD
CopyMemory GInput(3).xi(0), KInput, Len(KInput)
Call SendInput(4, GInput(0), Len(GInput(0)))
End Sub
  • 打赏
  • 举报
回复
xionghonge 2004-04-29
似乎两个键是先后按下的,也就是先按CTRL(不是按住),再按R键。
  • 打赏
  • 举报
回复
xionghonge 2004-04-29
ch21st(www.blanksoft.com),怎么CTRL按下没反应:
……
Const VK_CONTROL = 17 'ctrl键的虚拟键值
Const VK_R = 82 'R键的ascii码值(虚拟键值)
……

Private Sub Timer1_Timer()
SendKey (VK_CONTROL)
SendKey (VK_R)
End Sub
  • 打赏
  • 举报
回复
pigpag 2004-04-29
建议使用SendInput。这个函数直接将输入插入到系统输入消息列中,应该算是底层的了。
  • 打赏
  • 举报
回复
道素 2004-04-29
试试用SendInput api

Option Explicit
Const VK_H = 72
Const VK_E = 69
Const VK_L = 76
Const VK_O = 79
Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2
Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey
KInput.dwFlags = 0
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
KInput.wVk = bKey
KInput.dwFlags = KEYEVENTF_KEYUP
GInput(1).dwType = INPUT_KEYBOARD
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
VB基础类
加入

7543

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2004-04-29 03:57
社区公告
暂无公告