下面是锁指定的按键:Private 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 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 WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYUP = &H105Private Const NUM_LOCK = 144Private Const HC_ACTION = 0
Private Const WH_KEYBOARD_LL = 13Private lngHook As Long'to hold Keyboard by heading off windows messages
Private Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim blnHook As Boolean
    Dim p As PKBDLLHOOKSTRUCT
    
    If nCode = HC_ACTION Then
        Select Case wParam
            Case WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP
                Call CopyMemory(p, ByVal lParam, Len(p))
                If p.vkCode = NUM_LOCK Then
                    blnHook = True
                End If
            Case Else
                'do nothing
        End Select
    End If
    
    If blnHook Then
        LowLevelKeyboardProc = 1
    Else
        Call CallNextHookEx(WH_KEYBOARD_LL, nCode, wParam, lParam)
    End If
End FunctionPublic Sub KeyboardHook()
    lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
End SubPublic Sub UnKeyboardHook()
    Call UnhookWindowsHookEx(lngHook)
End Sub