请问,如何在程序以外用Hook记录下键盘的按键操作,并保存到文件。
本人是个菜鸟,请各位高手解答的详细点儿,最好由原代码。
谢谢!

解决方案 »

  1.   

    保存到文件部份自己写吧,不能太懒了哦
    以下是FORM部份代码:在Form上放Label1、Label2、Label3、List1
    所有键盘按键的ASCII码放在List1中了
    Option ExplicitPrivate Sub Form_Load()  Dim kbdState As KeyboardBytes
      
      Call GetKeyboardState(kbdState)
      
      With Label1
        .Caption = "Numlock亮"
        .Alignment = vbRightJustify
      End With
      
      With Label2
        .Caption = "Caps lock亮"
        .Alignment = vbRightJustify
      End With
      
      With Label3
        .Caption = "Scroll lock亮"
        .Alignment = vbRightJustify
      End With
           
      Label1.Visible = kbdState.kbByte(VK_NUMLOCK) = 1
      Label2.Visible = kbdState.kbByte(VK_CAPITAL) = 1
      Label3.Visible = kbdState.kbByte(VK_SCROLL) = 1
      
      m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
      
      If m_hDllKbdHook = 0 Then MsgBox "建立钩子失败"
       
       
    End Sub
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   If m_hDllKbdHook <> 0 Then Call UnhookWindowsHookEx(m_hDllKbdHook)
       
    End Sub
    '以下代码放在标准模块中
    Option ExplicitPublic m_hDllKbdHook As Long
    Public Const WH_KEYBOARD_LL As Long = 13
    Private Const HC_ACTION As Long = 0
    Public Const VK_CAPITAL As Long = &H14
    Public Const VK_NUMLOCK As Long = &H90
    Public Const VK_SCROLL As Long = &H91
    Private Const LLKHF_UP As Long = &H80&Public Type KeyboardBytes
       kbByte(0 To 255) As Byte
    End TypePrivate Type KBDLLHOOKSTRUCT
      vkCode As Long
      scanCode As Long
      flags As Long
      time As Long
      dwExtraInfo As Long
    End TypePublic 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
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal cb As Long)
    Public Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
    Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long   Dim kbdllhs As KBDLLHOOKSTRUCT
      
       If nCode = HC_ACTION Then
       
          Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))      If (kbdllhs.flags And LLKHF_UP) Then
          
             Select Case kbdllhs.vkCode
             
                Case VK_NUMLOCK
                   Form1.Label1.Visible = (GetKeyState(VK_NUMLOCK) = &HFF81)
                   
                Case VK_CAPITAL
                   Form1.Label2.Visible = (GetKeyState(VK_CAPITAL) = &HFF81)
                
                Case VK_SCROLL
                   Form1.Label3.Visible = (GetKeyState(VK_SCROLL) = &HFF81)
                   
                Case Else
                  Form1.List1.AddItem kbdllhs.vkCode
             End Select
             
          End If
          
       End If
      
       LowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, nCode, wParam, lParam)
      
    End Function