我算是看懂了我需要的部分程序。我当然会结贴了。顺便把我的测试程序也贴在上面,不过我对其中有些东西还不是很明白只是依样画瓢。 ‘窗体代码 Option ExplicitPrivate Sub Command1_Click() MsgBox "begin"‘表示记录消息开始 hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf KeyboardProc, App.hInstance, 0) End SubPrivate Sub Command2_Click() playLog = 2’这里不初始化也没有关系 lStartTime = EventArr(1).time'得到第一个消息的时间 '进行回放 hplay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, App.hInstance, 0)End SubPrivate Sub Command3_Click() '结束记录消息的过程 UnhookWindowsHookEx hHook End SubPrivate Sub Form_Load() lngCount = 1'因为我的数组是从1开始的 'bleFlag = False End Sub Private Sub Form_Unload(Cancel As Integer) 'remove the windows-hook UnhookWindowsHookEx hHook UnhookWindowsHookEx hplay End Sub ’模块代码 Option Explicit Public Type EVENTMSG'主要结构 message As Long paramL As Long paramH As Long time As Long hwnd As Long End Type Public playLog As Long'回放时候的循环变量 Public lngCount As Long'记录信息的循环变量,在回放信息的时候就成为你记录的信息总量+1 Private bdelay As Boolean Public Const HC_GETNEXT = 1 Public Const HC_SYSMODALOFF = 5 Public Const HC_SYSMODALON = 4 Public canplay As Boolean Public Const HC_SKIP = 2'不太明白什么意思 Public lStartTime As Long'上个消息的时间 Public Const WH_JOURNALRECORD = 0 Public hplay As Long'hook返回值 Public EventArr(1 To 100) As EVENTMSG'记录100个消息,不能多啊。如果要多的话,你要定义'不定数组 '把你记录的消息赋值回去 Public Declare Sub CopyMemoryT2H Lib "kernel32" Alias "RtlMoveMemory" (ByVal Dest As Long, Source As EVENTMSG, ByVal Length As Long) '把消息记录下来 Public Declare Sub CopyMemoryH2T Lib "kernel32" Alias "RtlMoveMemory" (Dest As EVENTMSG, ByVal Source As Long, ByVal Length As Long) Public bleFlag As Boolean Public Const WH_JOURNALPLAYBACK = 1 Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long 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 Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public hHook As LongPublic Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 'if idHook is less than zero, no further processing is required If idHook < 0 Then 'call the next hook KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam) Else CopyMemoryH2T EventArr(lngCount), lParam, Len(EventArr(lngCount)) lngCount = lngCount + 1 KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam) End If End FunctionPublic Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim Result As Long Dim sMsg As String Dim lPause As Long Dim evtMsg As EVENTMSG canplay = True Result = 0 If iCode < 0 Then Result = CallNextHookEx(hplay, iCode, wParam, lParam) ElseIf iCode = HC_SYSMODALON Then'不明白什么意思,根据原程序的解释好象这是系统发出的信息 canplay = False‘可以去掉也能运行 ElseIf iCode = HC_SYSMODALOFF Then'不明白什么意思 canplay = True’可以去掉 ElseIf ((canplay = True) And (iCode = HC_GETNEXT)) Then 'This code controls the timing between system messages If bdelay Then bdelay = False 'This result should be based on how fast your PC is If playLog > 1 And playLog < lngCount Then lPause = (EventArr(playLog).time - lStartTime) + 7 Else lPause = 0 End If lStartTime = EventArr(playLog).time Result = lPause End If CopyMemoryT2H lParam, EventArr(playLog), Len(EventArr(playLog))
ElseIf ((canplay = True) And (iCode = HC_SKIP)) Then If playLog >= lngCount Then UnhookWindowsHookEx hplay PlaybackProc = Result Exit Function End If bdelay = True Result = CallNextHookEx(hplay, iCode, wParam, lParam) playLog = playLog + 1 End If PlaybackProc = Result End Function 说明:是个测试程序,所以不是很精简。英文解释都是原程序提供的。这个例子只能回放100个消息,因为我是固定数组。多了就要出错了。反正主要的看明白了就行了。我不明白的主要就是icode参数表示的意义,不知道什么地方能看到它的说明。
‘窗体代码
Option ExplicitPrivate Sub Command1_Click()
MsgBox "begin"‘表示记录消息开始
hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf KeyboardProc, App.hInstance, 0)
End SubPrivate Sub Command2_Click()
playLog = 2’这里不初始化也没有关系
lStartTime = EventArr(1).time'得到第一个消息的时间
'进行回放
hplay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, App.hInstance, 0)End SubPrivate Sub Command3_Click()
'结束记录消息的过程
UnhookWindowsHookEx hHook
End SubPrivate Sub Form_Load()
lngCount = 1'因为我的数组是从1开始的
'bleFlag = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
'remove the windows-hook
UnhookWindowsHookEx hHook
UnhookWindowsHookEx hplay
End Sub
’模块代码
Option Explicit
Public Type EVENTMSG'主要结构
message As Long
paramL As Long
paramH As Long
time As Long
hwnd As Long
End Type
Public playLog As Long'回放时候的循环变量
Public lngCount As Long'记录信息的循环变量,在回放信息的时候就成为你记录的信息总量+1
Private bdelay As Boolean
Public Const HC_GETNEXT = 1
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public canplay As Boolean
Public Const HC_SKIP = 2'不太明白什么意思
Public lStartTime As Long'上个消息的时间
Public Const WH_JOURNALRECORD = 0
Public hplay As Long'hook返回值
Public EventArr(1 To 100) As EVENTMSG'记录100个消息,不能多啊。如果要多的话,你要定义'不定数组
'把你记录的消息赋值回去
Public Declare Sub CopyMemoryT2H Lib "kernel32" Alias "RtlMoveMemory" (ByVal Dest As Long, Source As EVENTMSG, ByVal Length As Long)
'把消息记录下来
Public Declare Sub CopyMemoryH2T Lib "kernel32" Alias "RtlMoveMemory" (Dest As EVENTMSG, ByVal Source As Long, ByVal Length As Long)
Public bleFlag As Boolean
Public Const WH_JOURNALPLAYBACK = 1
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
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
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As LongPublic Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'if idHook is less than zero, no further processing is required
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam)
Else
CopyMemoryH2T EventArr(lngCount), lParam, Len(EventArr(lngCount))
lngCount = lngCount + 1
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam)
End If
End FunctionPublic Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Result As Long
Dim sMsg As String
Dim lPause As Long
Dim evtMsg As EVENTMSG
canplay = True
Result = 0
If iCode < 0 Then
Result = CallNextHookEx(hplay, iCode, wParam, lParam)
ElseIf iCode = HC_SYSMODALON Then'不明白什么意思,根据原程序的解释好象这是系统发出的信息
canplay = False‘可以去掉也能运行
ElseIf iCode = HC_SYSMODALOFF Then'不明白什么意思
canplay = True’可以去掉
ElseIf ((canplay = True) And (iCode = HC_GETNEXT)) Then
'This code controls the timing between system messages
If bdelay Then
bdelay = False
'This result should be based on how fast your PC is
If playLog > 1 And playLog < lngCount Then
lPause = (EventArr(playLog).time - lStartTime) + 7
Else
lPause = 0
End If
lStartTime = EventArr(playLog).time
Result = lPause
End If
CopyMemoryT2H lParam, EventArr(playLog), Len(EventArr(playLog))
ElseIf ((canplay = True) And (iCode = HC_SKIP)) Then
If playLog >= lngCount Then
UnhookWindowsHookEx hplay
PlaybackProc = Result
Exit Function
End If
bdelay = True
Result = CallNextHookEx(hplay, iCode, wParam, lParam)
playLog = playLog + 1
End If
PlaybackProc = Result
End Function
说明:是个测试程序,所以不是很精简。英文解释都是原程序提供的。这个例子只能回放100个消息,因为我是固定数组。多了就要出错了。反正主要的看明白了就行了。我不明白的主要就是icode参数表示的意义,不知道什么地方能看到它的说明。