如题
目前的代码如下,但是没有实现将动作保存到文件中和从文件中读取并回放的步骤。
谢谢各位大侠...
----------------------------------------------------------------------------------unit Unit1;
interface
 uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; 
type TForm1 = class(TForm)
 Button1: TButton;
 Button2: TButton;
 Button3: TButton;
 Edit1: TEdit;
 Button4: TButton;
    Memo1: TMemo;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 procedure Button3Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end; 
 var
 Form1: TForm1;
 EventArr:array[0..1000]of EVENTMSG;
 EventLog:Integer;
 PlayLog:Integer;
 hHook,hPlay:Integer;
 recOK:Integer;
 canPlay:Integer;
 bDelay:Bool;
 implementation
 {$R *.DFM}
 Function PlayProc (iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
 begin 
 canPlay:=1;
 Result:=0;
 if iCode < 0 then //必须将消息传递到消息链的下一个接受单元
    Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
    else
    if iCode = HC_SYSMODALON then canPlay:=0
       else
       if iCode = HC_SYSMODALOFF then canPlay:=1
          else
          if ((canPlay =1 )and(iCode=HC_GETNEXT)) then
             begin 
             if bDelay then
                begin 
                bDelay:=False;
                Result:=50;
                end;
             pEventMSG(lParam)^:=EventArr[PlayLog];
             end
             else
              if ((canPlay = 1)and(iCode = HC_SKIP))then
                  begin
                  bDelay := True;
                  PlayLog:=PlayLog+1;
                  end;
    if PlayLog>=EventLog then
       begin
       UNHookWindowsHookEx(hPlay);
       end;
end;
 function HookProc (iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
 begin
 recOK:=1;
 Result:=0;
 if iCode < 0 then
    Result := CallNextHookEx(hHook,iCode,wParam,lParam)
    else
    if iCode = HC_SYSMODALON then
       recOK:=0
       else
       if iCode = HC_SYSMODALOFF then
           recOK:=1
           else
           if ((recOK>0) and (iCode = HC_ACTION)) then
              begin
               EventArr[EventLog]:=pEventMSG(lParam)^;               EventLog:=EventLog+1;
               if EventLog>=1000 then
                  begin
                  UnHookWindowsHookEx(hHook);
                  end;
              end; end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   Button1.Caption:='纪录';
   Button2.Caption:='停止';
   Button3.Caption:='回放';
   Button4.Caption:='范例';
   Button2.Enabled:=False;
   Button3.Enabled:=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EventLog:=0; //建立键盘鼠标操作消息纪录链
hHook:=SetwindowsHookEx (WH_JOURNALRECORD,HookProc,HInstance,0);
Button2.Enabled:=True;
Button1.Enabled:=False;
end; 
procedure TForm1.Button2Click(Sender: TObject);
begin
 UnHookWindowsHookEx(hHook); 
 hHook:=0;
 Button1.Enabled:=True;
 Button2.Enabled:=False;
 Button3.Enabled:=True;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
 PlayLog:=0; //建立键盘鼠标操作消息纪录回放链
 hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc, HInstance,0);
 Button3.Enabled:=False;
 end;
 end.

解决方案 »

  1.   

    THead = Packed Record
        iCount: Cardinal;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Button4: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      EventArr:array[0..1000]of EVENTMSG;
      EventLog:Integer;
      PlayLog:Integer;
      hHook,hPlay:Integer;
      recOK:Integer;
      canPlay:Integer;
      bDelay:Bool;
      FRecordHnd: Integer=-1;const RecordFile = 'C:\Record.dat';implementationuses Math;{$R *.dfm}
    Function PlayProc (iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
    begin
      canPlay:=1;
      Result:=0;
      if iCode < 0 then //必须将消息传递到消息链的下一个接受单元
        Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
      else
      if iCode = HC_SYSMODALON then canPlay:=0
      else
      if iCode = HC_SYSMODALOFF then canPlay:=1
      else
      if ((canPlay =1 )and(iCode=HC_GETNEXT)) then
      begin
        if bDelay then
        begin
          bDelay:=False;
          Result:=50;
        end;
        pEventMSG(lParam)^:=EventArr[PlayLog];
      end
      else
      if ((canPlay = 1)and(iCode = HC_SKIP))then
      begin
        bDelay := True;
        PlayLog:=PlayLog+1;
      end;  if PlayLog>=EventLog then
      begin
        UNHookWindowsHookEx(hPlay);
      end;
    end;function HookProc (iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
    var
      AHead: THead;
      AEvent: EVENTMSG;
    begin
      recOK:=1;
      Result:=0;  if iCode < 0 then
        Result := CallNextHookEx(hHook,iCode,wParam,lParam)
      else if iCode = HC_SYSMODALON then recOK:=0
      else if iCode = HC_SYSMODALOFF then recOK:=1
      else if ((recOK>0) and (iCode = HC_ACTION)) then
      begin
        EventArr[EventLog]:=pEventMSG(lParam)^;
        EventLog:=EventLog+1;
        FillChar(AHead, SIZEOF(AHead), #0);
        FillChar(AEvent, Sizeof(AHead), #0);
        AEvent := EventArr[EventLog-1];    FileSeek(FRecordHnd, 0, 0);
        FileRead(FRecordHnd, AHead, Sizeof(AHead));
        AHead.iCount := AHead.iCount + 1;
        FileWrite(FRecordHnd, AHead, Sizeof(AHead));
        FileSeek(FRecordHnd, Sizeof(AHead)+100+(EventLog-1)*SizeOf(AEvent), 0);
        FileWrite(FRecordHnd, AEvent, Sizeof(AEvent));    if EventLog>=1000 then UnHookWindowsHookEx(hHook);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       Button1.Caption:='纪录';
       Button2.Caption:='停止';
       Button3.Caption:='回放';
       Button4.Caption:='范例';
       Button2.Enabled:=False;
    //   Button3.Enabled:=False;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      If Not FileExists(RecordFile) then FRecordHnd := FileCreate(RecordFile)
      else FRecordHnd := FileOpen(RecordFile, fmOpenReadWrite) ;  EventLog:=0; //建立键盘鼠标操作消息纪录链
      hHook:=SetwindowsHookEx (WH_JOURNALRECORD,HookProc,HInstance,0);
      Button2.Enabled:=True;
      Button1.Enabled:=False;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     UnHookWindowsHookEx(hHook); 
     hHook:=0;
     Button1.Enabled:=True;
     Button2.Enabled:=False;
     Button3.Enabled:=True;
     FileClose(FRecordHnd);
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    var
      I: Integer;
      AHead: THead;
      AEvent: EVENTMSG;
    begin
      FillChar(AHead, SIZEOF(AHead), #0);  if FRecordHnd < 0 then
        FRecordHnd := FileOpen(RecordFile, fmOpenReadWrite);  FileSeek(FRecordHnd, 0, 0);
      FileRead(FRecordHnd, AHead, SizeOf(AHead));  for I := 0 to AHead.iCount-1 do
      begin
        FillChar(AEvent, Sizeof(AHead), #0);
        FileSeek(FRecordHnd, Sizeof(AHead)+100+I*SizeOf(AEvent), 0);
        FileRead(FRecordHnd, AEvent, SizeOf(AEvent));
        EventArr[I] := AEvent;
      end;
      EventLog := AHead.iCount; PlayLog:=0; //建立键盘鼠标操作消息纪录回放链
     hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK, PlayProc, HInstance,0);
     Button3.Enabled:=False;
    end;