Private Sub Txt_UserName_KeyDown(KeyCode As Integer, Shift As Integer) Dim CtrlDown As Long CtrlDown = (Shift And vbCtrlMask) > 0 If KeyCode = vbKeyV And CtrlDown Then ' Txt_UserName.Text = Clipboard.GetText Txt_UserName.Text = strClipBoardText txtPassWd.SetFocus Exit Sub End If End Sub
试试用SendInput apiOption 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
建议使用SendInput。这个函数直接将输入插入到系统输入消息列中,应该算是底层的了。
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
似乎两个键是先后按下的,也就是先按CTRL(不是按住),再按R键。
程序终于搞懂,也运行正常,在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)
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里面插输入的函数
Private Sub Txt_UserName_KeyDown(KeyCode As Integer, Shift As Integer)
Dim CtrlDown As Long
CtrlDown = (Shift And vbCtrlMask) > 0
If KeyCode = vbKeyV And CtrlDown Then
' Txt_UserName.Text = Clipboard.GetText
Txt_UserName.Text = strClipBoardText
txtPassWd.SetFocus
Exit Sub
End If
End Sub
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
……
Const VK_CONTROL = 17 'ctrl键的虚拟键值
Const VK_R = 82 'R键的ascii码值(虚拟键值)
……Private Sub Timer1_Timer()
SendKey (VK_CONTROL)
SendKey (VK_R)
End Sub
但遗憾的是:对游戏仍然无效!!!!
对游戏仍然无效!!!!
对游戏仍然无效!!!!
对游戏仍然无效!!!!
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
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消息
我在这里等,等到你研究出结果!
今天放假,没想到今天还挺忙
我刚才试了一下在vb中用postmessage发送WM_Hotkey但是不能达到预期效果
而且用spy++并没有发现它发送出WM_Hotkey消息,而是WM_Command之类的,看来我的写法不对你也可以用spy++检视一下,至于常数是多少先不用管,先用spy++从按键精灵的消息中搞出WM_HOTKEY的消息参数,你原样用vb发送看看效果还有即使原来不行的api你要考虑每个按键是两个消息,不过你如果已经在游戏以外成功了,可能这点可以跳过这点
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里面插输入的函数
不可能吧?是不是搞错了?