'--------------------------------------------------------------
'以下模块中
'--------------------------------------------------------------
Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" _
   (ByVal hHook As Long, _
    ByVal ncode As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long
    
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 UnhookWindowsHookEx Lib "user32" _
   (ByVal hHook As Long) As Long
   
Private Declare Function GetKeyState Lib "user32" _
   (ByVal nVirtKey As Long) As Integer
   
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (Destination As Any, _
    Source As Any, _
    ByVal Length As Long)Private Type PKBDLLHOOKSTRUCT
    VKCode As Long
    scanCode As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End TypePrivate Const WH_KEYBOARD_LL = 13
Private Const HC_ACTION = 0
Private Const WM_KEYDOWN = &H100
Private Const VK_CONTROL = &H11
Private Const VK_SHIFT = &H10
Private Const VK_MULTIPLY = &H6A
Private Const VK_ADD = &H6B
Private Const VK_SEPARATOR = &H6C
Private Const VK_SUBTRACT = &H6D
Private Const VK_DECIMAL = &H6E
Private Const VK_DIVIDE = &H6F
Private Const VK_PRIOR = &H21
Private Const VK_NEXT = &H22
Private Const VK_END = &H23
Private Const VK_HOME = &H24
Private Const VK_LEFT = &H25
Private Const VK_UP = &H26
Private Const VK_DOWN = &H28
Private Const VK_RIGHT = &H27
Private Const VK_INSERT = &H2D
Private Const VK_DELETE = &H2E
Private Const VK_F1 = &H70
Private Const VK_F12 = &H7B
Private Const VK_NUMLOCK = &H90
Private Const VK_NUMPAD0 = &H60
Private Const VK_NUMPAD9 = &H69
Private Const VK_RETURN = &HD
Private Const VK_SPACE = &H20
Private Const VK_TAB = &H9
Private Const VK_ESCAPE = &H1B
Private Const VK_BACK = &H8Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, _
                                     ByVal wParam As Long, _
                                     ByVal lParam As Long) As Long
    Dim p As PKBDLLHOOKSTRUCT
    Dim strKey As String
    
    If ncode = HC_ACTION Then
        Select Case wParam
            Case WM_KEYDOWN
                CopyMemory p, ByVal lParam, Len(p)
                
                If p.VKCode > 0 And p.VKCode < &H92 Then
                    If (GetKeyState(VK_CONTROL) And &H8000) <> 0 Then
                        strKey = "{Ctrl}+"
                    End If
                    
                    If (GetKeyState(VK_SHIFT) And &H8000) <> 0 Then
                        strKey = strKey & "{Shift}+"
                    End If
                    
                    Select Case p.VKCode
                    Case VK_MULTIPLY
                        strKey = strKey & "{Multiply}"
                    Case VK_ADD
                        strKey = strKey & "{Add}"
                    Case VK_SEPARATOR
                        strKey = strKey & "{Separator}"
                    Case VK_SUBTRACT
                        strKey = strKey & "{Subtract}"
                    Case VK_DECIMAL
                        strKey = strKey & "{Decimal}"
                    Case VK_DIVIDE
                        strKey = strKey & "{Divide}"
                    Case VK_PRIOR
                        strKey = strKey & "{Prior}"
                    Case VK_NEXT
                        strKey = strKey & "{Nexe}"
                    Case VK_END
                        strKey = strKey & "{End}"
                    Case VK_HOME
                        strKey = strKey & "{Home}"
                    Case VK_LEFT
                        strKey = strKey & "{Left}"
                    Case VK_UP
                        strKey = strKey & "{Up}"
                    Case VK_DOWN
                        strKey = strKey & "{Down}"
                    Case VK_RIGHT
                        strKey = strKey & "{Right}"
                    Case VK_INSERT
                        strKey = strKey & "{Insert}"
                    Case VK_DELETE
                        strKey = strKey & "{Delete}"
                    Case VK_BACK
                        strKey = strKey & "{Back}"
                    Case VK_F1 To VK_F12
                        strKey = strKey & "F" & CStr(p.VKCode - &H70)
                    Case VK_NUMLOCK
                        strKey = strKey & "{NumLock}"
                    Case VK_NUMPAD0 To VK_NUMPAD9
                        strKey = strKey & CStr(p.VKCode - &H60)
                    Case VK_RETURN
                        strKey = strKey & "{Return}"
                    Case VK_SPACE
                        strKey = strKey & "{Space}"
                    Case VK_TAB
                        strKey = strKey & "{Tab}"
                    Case VK_ESCAPE
                        strKey = strKey & "{Escape}"
                    Case &H30 To &H39, &H41 To &H5A
                        strKey = strKey & Chr(p.VKCode)
                    Case Else
                        'do nothing
                    End Select
                    Form1.Text1.Text = Form1.Text1.Text & " " & strKey
                End If
                
            Case Else
                'do nothing
                
        End Select
    End If
    
    CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
End FunctionPublic Sub Hook()
    PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
                                AddressOf LowLevelKeyboardProc, _
                                App.hInstance, _
                                0)
End SubPublic Sub ReleaseHook()
    Call UnhookWindowsHookEx(PrevHook)
End Sub
'--------------------------------------------------------------
'以下在窗体中(窗体中放一个TextBox,MultiLine=True,ScrollBar=2)
'--------------------------------------------------------------
Private Sub Form_Load()
    Call Hook
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Call ReleaseHook
End Sub