vb6钩子有关问题。大哥哥大姐姐们帮帮忙

vb6钩子问题。大哥哥大姐姐们帮帮忙啊
VB code

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length 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 GetKeyboardState Lib "user32 " (pbKeyState As Byte) As Long
Private Declare Function GetKeyState Lib "user32" (ByVal nVirkey As Long) As Long
Private Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
'Private Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" (lpvdest As Any, ByVal lpsource As Long, ByVal cbcopy As Long)
Private JPhHook As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Type KEYMSGS
    vKey As Long
    sKey As Long
    flag As Long
    time As Long
End Type
Private keyMsg As KEYMSGS
'消息
Private Const WH_KEYBOARD_LL As Long = 13
Private Const HC_ACTION = 0
Private Const HC_SYSMODALOFF = 5
Private Const HC_SYSMODALON = 4
'键盘消息
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105

Public Sub EnableHook()
    If JPhHook = 0 Then
       JPhHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf JPHookProc, App.hInstance, 0)
    End If
End Sub

Public Sub FreeHook()
    If JPhHook <> 0 Then
        Call UnhookWindowsHookEx(JPhHook)
    End If
End Sub

Public Function JPHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim IKey As Long
    Dim strKeyName As String * 255
    Dim strLen As Long
    If nCode = HC_ACTION Then
        CopyMemory keyMsg, lParam, LenB(keyMsg)
        Select Case wParam
            Case WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:
             IKey = keyMsg.sKey And &HFF
             IKey = IKey * 65536
             strLen = GetKeyNameText(IKey, strKeyName, strLen)
             Debug.Print "键名:" & Left(strKeyName, strLen)
             Debug.Print "虚拟:" & Left(keyMsg.vKey And &HFF, "0")
             Debug.Print "扫描码:" & Format(IKey / 65536, "0")
        End Select
        
    End If
End Function





为什么输出来的 键名和虚拟是空的啊。

------解决方案--------------------
叫夜闻香过来哼哼哈
------解决方案--------------------
死草的灌水机器人……

------解决方案--------------------
很简单的改动。主要是CopyMemory 的参数传输:
VB code
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length 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 GetKeyboardState Lib "user32 " (pbKeyState As Byte) As Long
Private Declare Function GetKeyState Lib "user32" (ByVal nVirkey As Long) As Long
Private Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
'Private Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" (lpvdest As Any, ByVal lpsource As Long, ByVal cbcopy As Long)
Private JPhHook As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Type KEYMSGS
    vKey As Long
    sKey As Long
    flag As Long
    time As Long
End Type
Private keyMsg As KEYMSGS
'消息
Private Const WH_KEYBOARD_LL As Long = 13
Private Const HC_ACTION = 0
Private Const HC_SYSMODALOFF = 5
Private Const HC_SYSMODALON = 4
'键盘消息
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105

Public Sub EnableHook()
    If JPhHook = 0 Then
       JPhHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf JPHookProc, App.hInstance, 0)
    End If
End Sub

Public Sub FreeHook()
    If JPhHook <> 0 Then
        Call UnhookWindowsHookEx(JPhHook)
    End If
End Sub

Public Function JPHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim IKey As Long
    Dim strKeyName As String * 255
    Dim strLen As Long
    If nCode = HC_ACTION Then
        CopyMemory ByVal keyMsg, ByVal lParam, Len(keyMsg)
        Select Case wParam
            Case WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:
             IKey = keyMsg.sKey And &HFF
             IKey = IKey * 65536
             strLen = 256
             strLen = GetKeyNameText(IKey, strKeyName, strLen)
             Debug.Print "键名:" & Left(strKeyName, InStr(strKeyName, Chr(0)) - 1)
             Debug.Print "虚拟:" & keyMsg.vKey
             Debug.Print "扫描码:" & Format(IKey / 65536, "0")
        End Select
        
    End If
End Function