CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 7 of 7
  1. #1

    How to Capture keyboard input??!?!

    I realize that I need to use the getkeyboardstate api call... what i want to do is just check if a key is being pressed, it really doesnt matter what key, can you drop me a hint??? Thanks.

    FaRd0wN


  2. #2
    Join Date
    May 2000
    Location
    New York, NY, USA
    Posts
    2,878

    Re: How to Capture keyboard input??!?!

    'Set the KeyPreview Property of the form to True

    'Put this code in the KeyDown even of the form
    'Look up Key code constants in VB help for other key codes

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)Then
    msgbox "Key pressed"

    End Sub

    Iouri Boutchkine
    [email protected]
    Iouri Boutchkine
    [email protected]

  3. #3

    Re: How to Capture keyboard input??!?!

    nah, i need to find out what keys are being pressed outside of my programs interface, hence, api.



  4. #4
    Join Date
    May 2000
    Location
    New York, NY, USA
    Posts
    2,878

    Re: How to Capture keyboard input??!?!

    Code:
    'module
    
    Public Enum HookFlags
        HFMouseDown = 1
        HFMouseUp = 2
        HFMouseMove = 4
        HFKeyDown = 8
        HFKeyUp = 16
    End Enum
    
    
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
    Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long)
    Private Declare Function GetForegroundWindow& Lib "user32" ()
    Private Declare Function GetWindowThreadProcessId& Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long)
    Private Declare Function GetKeyboardLayout& Lib "user32" (ByVal dwLayout As Long)
    Private Declare Function MapVirtualKeyEx Lib "user32" Alias "MapVirtualKeyExA" (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
        Private Const SWP_NOSIZE = &H1
        Private Const SWP_NOMOVE = &H2
        Private Const SWP_NOREDRAW = &H8
        Private Const WM_KEYDOWN = &H100
        Private Const WM_KEYUP = &H101
        Private Const WM_MOUSEMOVE = &H200
        Private Const WM_LBUTTONDOWN = &H201
        Private Const WM_LBUTTONUP = &H202
        Private Const WM_LBUTTONDBLCLK = &H203
        Private Const WM_RBUTTONDOWN = &H204
        Private Const WM_RBUTTONUP = &H205
        Private Const WM_RBUTTONDBLCLK = &H206
        Private Const WM_MBUTTONDOWN = &H207
        Private Const WM_MBUTTONUP = &H208
        Private Const WM_MBUTTONDBLCLK = &H209
        Private Const WM_MOUSEWHEEL = &H20A
        Private Const WH_JOURNALRECORD = 0
    
    
    Type EVENTMSG
        wMsg As Long
        lParamLow As Long
        lParamHigh As Long
        ' msgTime As Long
        ' hWndMsg As Long
        End Type
        Dim EMSG As EVENTMSG
        Dim hHook As Long, frmHooked As Form, hFlags As Long
    
    
    Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
    
        If nCode < 0 Then
            HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
            Exit Function
        End If
        Dim i%, j%, k%
        CopyMemory EMSG, ByVal lParam, Len(EMSG)
    
    
        Select Case EMSG.wMsg
            Case WM_KEYDOWN
    
    
            If (hFlags And HFKeyDown) = HFKeyDown Then
                If GetAsyncKeyState(vbKeyShift) Then j = 1
                If GetAsyncKeyState(vbKeyControl) Then j = 2
                If GetAsyncKeyState(vbKeyMenu) Then j = 4
    
    
                Select Case (EMSG.lParamLow And &HFF)
                    Case 0 To 31, 90 To 159
                    k = (EMSG.lParamLow And &HFF)
                    Case Else
                    k = MapVirtualKeyEx(EMSG.lParamLow And &HFF, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))
                End Select
            frmHooked.System_KeyDown k, j
        End If
        Case WM_KEYUP
    
    
        If (hFlags And HFKeyUp) = HFKeyUp Then
            If GetAsyncKeyState(vbKeyShift) Then j = 1
            If GetAsyncKeyState(vbKeyControl) Then j = 2
            If GetAsyncKeyState(vbKeyMenu) Then j = 4
    
    
            Select Case (EMSG.lParamLow And &HFF)
                Case 0 To 31, 90 To 159
                k = (EMSG.lParamLow And &HFF)
                Case Else
                k = MapVirtualKeyEx(EMSG.lParamLow And &HFF, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))
            End Select
        frmHooked.System_KeyUp k, j
    End If
    Case WM_MOUSEWHEEL
    Debug.Print "MouseWheel"
    Case WM_MOUSEMOVE
    
    
    If (hFlags And HFMouseMove) = HFMouseMove Then
        If GetAsyncKeyState(vbKeyLButton) Then i = 1
        If GetAsyncKeyState(vbKeyRButton) Then i = 2
        If GetAsyncKeyState(vbKeyMButton) Then i = 4
        If GetAsyncKeyState(vbKeyShift) Then j = 1
        If GetAsyncKeyState(vbKeyControl) Then j = 2
        If GetAsyncKeyState(vbKeyMenu) Then j = 4
        frmHooked.System_MouseMove i, j, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh)
    End If
    Case WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN
    
    
    If (hFlags And HFMouseDown) = HFMouseDown Then
        If GetAsyncKeyState(vbKeyShift) Then i = 1
        If GetAsyncKeyState(vbKeyControl) Then i = 2
        If GetAsyncKeyState(vbKeyMenu) Then i = 4
        frmHooked.System_MouseDown 2 ^ ((EMSG.wMsg - 513) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh)
    End If
    Case WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP
    
    
    If (hFlags And HFMouseUp) = HFMouseUp Then
        If GetAsyncKeyState(vbKeyShift) Then i = 1
        If GetAsyncKeyState(vbKeyControl) Then i = 2
        If GetAsyncKeyState(vbKeyMenu) Then i = 4
        frmHooked.System_MouseUp 2 ^ ((EMSG.wMsg - 514) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh)
    End If
    End Select
    Call CallNextHookEx(hHook, nCode, wParam, lParam)
    End Function
    
    
    Public Sub SetHook(fOwner As Form, flags As HookFlags)
        hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, 0, 0)
        Set frmHooked = fOwner
        hFlags = flags
        Window_SetAlwaysOnTop frmHooked.hwnd, True
    End Sub
    
    
    Public Sub RemoveHook()
        UnhookWindowsHookEx hHook
        Window_SetAlwaysOnTop frmHooked.hwnd, False
        Set frmHooked = Nothing
    End Sub
    
    
    Private Function Window_SetAlwaysOnTop(hwnd As Long, bAlwaysOnTop As Boolean) As Boolean
        Window_SetAlwaysOnTop = SetWindowPos(hwnd, -2 - bAlwaysOnTop, 0, 0, 0, 0, SWP_NOREDRAW Or SWP_NOSIZE Or SWP_NOMOVE)
    End Function
    
    
    'form
    
    Private Sub Form_Load()
        SetHook Me, HFMouseDown + HFMouseUp + HFMouseMove + HFKeyDown + HFKeyUp
        Text1 = "Mouse activity log:"
        Text2 = "Keyboard activity log:"
    End Sub
    
    
    Public Sub System_KeyDown(KeyCode As Integer, Shift As Integer)
        Dim s As String
    
    
        Select Case KeyCode
            Case 32 To 90, 160 To 255
            s = LCase(Chr$(KeyCode))
            Case Else
            s = "ASCII code " & KeyCode
        End Select
    If Shift = vbShiftMask Then s = UCase(s): s = s & " + Shift "
    If Shift = vbCtrlMask Then s = s & " + Ctrl "
    If Shift = vbAltMask Then s = s & " + Alt "
    Text2 = Text2 & vbCrLf & s & " down"
    End Sub
    
    Public Sub System_KeyUp(KeyCode As Integer, Shift As Integer)
        Dim s As String
    
    
        Select Case KeyCode
            Case 32 To 90, 160 To 255
            s = LCase(Chr$(KeyCode))
            Case Else
            s = "ASCII code " & KeyCode
        End Select
    If Shift = vbShiftMask Then s = UCase(s): s = s & " + Shift "
    If Shift = vbCtrlMask Then s = s & " + Ctrl "
    If Shift = vbAltMask Then s = s & " + Alt "
    Text2 = Text2 & vbCrLf & s & " up"
    End Sub
    
    
    Public Sub System_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim s As String
        If Button = vbLeftButton Then s = "Left Button "
        If Button = vbRightButton Then s = "Right Button "
        If Button = vbMiddleButton Then s = "Middle Button "
        If Shift = vbShiftMask Then s = s & "+ Shift "
        If Shift = vbCtrlMask Then s = s & "+ Ctrl "
        If Shift = vbAltMask Then s = s & "+ Alt "
        Text1 = Text1 & vbCrLf & s & "Down at pos (pixels): " & CStr(x) & " , " & CStr(y)
    End Sub
    
    
    Public Sub System_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim s As String
        If Button = vbLeftButton Then s = "Left Button "
        If Button = vbRightButton Then s = "Right Button "
        If Button = vbMiddleButton Then s = "Middle Button "
        If Shift = vbShiftMask Then s = s & "+ Shift "
        If Shift = vbCtrlMask Then s = s & "+ Ctrl "
        If Shift = vbAltMask Then s = s & "+ Alt "
        Text1 = Text1 & vbCrLf & s & "Up at pos (pixels): " & CStr(x) & " , " & CStr(y)
    End Sub
    
    
    Public Sub System_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim s As String
        If Button = vbLeftButton Then s = "Left Button "
        If Button = vbRightButton Then s = "Right Button "
        If Button = vbMiddleButton Then s = "Middle Button "
        If Shift = vbShiftMask Then s = s & "+ Shift "
        If Shift = vbCtrlMask Then s = s & "+ Ctrl "
        If Shift = vbAltMask Then s = s & "+ Alt "
        Label1 = "Mouse info" & vbCrLf & "X = " & x & " Y= " & y & vbCrLf
        If s <> "" Then Label1 = Label1 & "Extra Info: " & vbCrLf & s & "pressed"
    End Sub
    
    
    Private Sub Form_Unload(Cancel As Integer)
        RemoveHook
    End Sub




    Iouri Boutchkine
    [email protected]
    Last edited by Cimperiali; May 12th, 2005 at 06:36 AM. Reason: adding code tags
    Iouri Boutchkine
    [email protected]

  5. #5

    Re: How to Capture keyboard input??!?!

    - Thanks!!!!!! I would vote 10 but i can only give you a 3. Thank you very much for the extensive explaination!


  6. #6
    Join Date
    Jun 2003
    Location
    Chennai - India
    Posts
    6

    Problem in VB code.

    hi, the code that was given here is not working my machine. am using windows 2000 system. could you please help me.

    thanks
    prasath
    Prasath

  7. #7
    Join Date
    May 2003
    Location
    Australia
    Posts
    155
    Hi,

    Another option you could look at if you only wanted to check for one or two different key combinations being pressed, is the RegisterHotKey() API.

    This results in a message being sent to your form whenever the key combination is pressed.

    You would need to subclass the form to check for the hotkey message, but if you know about subclassing, its only a few lines of code you need to worry about to setup the hotkey.

    Can give you more details if you are interested.

    Cheers,
    Tinbum747
    Zen-Programming:

    If a compiler beeps in the IDE forest, and nobody hears it, was there really a bug?

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured