实验二:全局模拟键盘
跟上次不同,上次是需要知道具体窗口的句柄,现在不用了,所有窗口都响应的就叫全局咯。
简单得很,看吧。
(一)
添加模块
编写代码
Declare Sub keybd_event()Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Declare Sub Sleep()Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Sub Sleep()Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Const VK_A = &H41
然后编写窗体代码
Private Sub Command1_Click()Sub Command1_Click()
Dim i As Integer
For i = 0 To 30
keybd_event VK_A, 0, 0, 0 '按下A键
Sleep 500 '延时500毫秒
Next i
End Sub
对一些DIRECTX游戏,最好还是用
’先获得按键的扫描码
keybd_event VK_A, MapVirtualKey(VK_A, 0), 0, 0 '按下A键
OK,执行就可以体验了,选中一个可以输入的地方。
(二)
第二种方法比较麻烦,虽然功能也差不多
模块代码
Declare Function SendInput()Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Declare Sub CopyMemory()Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Declare Sub Sleep()Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Const INPUT_KEYBOARD = 1
Public Const VK_A = &H41
Sub MySendKey()Sub MySendKey(bkey As Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
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的数据复制到GInput
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(1).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中
SendInput 2, GInput(0), Len(GInput(0)) '把GInput中存放的消息插入到消息列队
End Sub
Declare Sub CopyMemory()Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Declare Sub Sleep()Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Const INPUT_KEYBOARD = 1
Public Const VK_A = &H41
Sub MySendKey()Sub MySendKey(bkey As Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
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的数据复制到GInput
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(1).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中
SendInput 2, GInput(0), Len(GInput(0)) '把GInput中存放的消息插入到消息列队
End Sub
编写窗体代码
Private Sub Command1_Click()Sub Command1_Click()
Dim i As Integer
For i = 0 To 30
MySendKey VK_A '按下A键
Sleep 500 '延时500毫秒
Next i
End Sub