Pages

Wednesday, 3 February 2010

Simulate Keystrokes using Win32 API (SendInput)?

Recently, I was modifying the old softphone source code (written in VB6) and encountered error using ‘SendKeys’ function. Sometimes, it sends multiple keystrokes for the same char resulting in application errors. Thought of using WinAPI’s to simulate keystrokes and got this one..works really well…

 

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)

Private Sub SendKey(bKey As Byte)

Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
      

       KInput.wVk = bKey 'the key we're going to press
       KInput.dwFlags = 0 'press the key

       'copy the structure into the input array 's buffer.
       GInput(0).dwType = INPUT_KEYBOARD ' keyboard input
       CopyMemory GInput(0).xi(0), KInput, Len(KInput)

'do the same as above, but for releasing ' the key

        KInput.wVk = bKey ' the key we're going to realease
        KInput.dwFlags = KEYEVENTF_KEYUP ' release the key
        GInput(1).dwType = INPUT_KEYBOARD
' keyboard input
       CopyMemory GInput(1).xi(0), KInput, Len(KInput)
       
'send the input now
        Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub

To simulate “H” Keystroke, just call SendKey(CByte(asc(“H”))

How to multiple selected items from List Box (VB6)?

Ever wondered how to remove multiple selected items from list box in VB6? Trick here is loop through listbox in REVERSE.

Here is the sample and enjoy :-)

Dim intCount As Integer

For intCount = (lstSample.ListCount -1 1) To 0 Step -1

If lstSample.Selected(intCount) Then

lstSample.RemoveItem intCount

End If

Next