我希望能做一个能记录100个键盘鼠标操作然后回放的程序,在dephi里以前看到过可是一下子找不到,希望高手能给予回答

解决方案 »

  1.   

    www.21code.com系统控制部分有一个键盘鼠标宏记录器,位置在5页之后,你找找吧
      

  2.   

    您提出这么好的问题是CSDN的福气,也是大家的福气,尽管没人回答得了,但您总不至于不结贴吧?既然一个回答的都没有,您就无法结贴了。我帮你UP吧,你只要在结贴的时候给我所有的分。万一碰上高人能回答了您的问题,那时候给我一半就可以了。
      

  3.   

    我算是看懂了我需要的部分程序。我当然会结贴了。顺便把我的测试程序也贴在上面,不过我对其中有些东西还不是很明白只是依样画瓢。
    ‘窗体代码
    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参数表示的意义,不知道什么地方能看到它的说明。
      

  4.   

    忘了一句重要的说明,先点command1,然后点command3,然后点command2。先不结贴,怕没人看,不过我肯定会结贴的