bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Delphi Delphi 建立鍵盤滑鼠動作紀錄與回放
查看: 2405|回復: 0
go

Delphi 建立鍵盤滑鼠動作紀錄與回放 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2010-1-24 14:13 |只看該作者 |倒序瀏覽 |打印
很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用了Windows的Hook函数。

  Windows 提供 API 函数 SetWindowsHookEx 来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows消息,函数语法为:

    SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD)

    其中参数idHook指定建立的监视函数类型。通过Windows MSDN帮助可以看到,SetWindowsHookEx函数提供15种不同的消息监视类型,在这里我们将使用 WH_JOURNALRECORD 和 WH_JOURNALPLAYBACK 来监视键盘和鼠标操作。参数 lpfn 指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。
函数的一般形式为:

    HookProc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;

  其中 code 为系统指示标记,wParam 和 lParam 为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样一个函数再通过 SetWindowsHookEx 函数将它加入到消息监视链中就可以处理消息了。
    在不需要监视系统消息时需要调用提供 UnHookWindowsHookEx 来解除对消息的监视。
    WH_JOURNALRECORD 和 WH_JOURNALPLAYBACK 类型是两种相反的 Hook 类型,前者获得鼠标、键盘动作消息,后者回放鼠标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于将保存的操作返给系统回放。

下面来建立程序,在 Delphi 中建立一个工程,在 Form1 上添加 3 个按钮用于程序操作。另外再添加一个按钮控件和一个 Edit 控件用于验证操作。 下面是Form1的全部代码
  1. unit Unit1;

  2. interface

  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls;

  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     Button2: TButton;
  10.     Button3: TButton;
  11.     procedure FormCreate(Sender: TObject);
  12.     procedure Button1Click(Sender: TObject);
  13.     procedure Button2Click(Sender: TObject);
  14.     procedure Button3Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;

  20. var
  21.   Form1: TForm1;

  22.   EventArr: array[0..1000] of EVENTMSG;
  23.   EventLog: Integer;
  24.   PlayLog: Integer;
  25.   hHook, hPlay: Integer;
  26.   recOK: Integer;
  27.   canPlay: Integer;
  28.   bDelay: Boolean;

  29. implementation

  30. {$R *.DFM}

  31. Function PlayProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
  32. begin
  33.   canPlay := 1;
  34.   Result := 0;

  35.   if iCode < 0 then  Result := CallNextHookEx(hPlay, iCode, wParam, lParam)
  36.   else if iCode = HC_SYSMODALON  then  canPlay := 0
  37.   else if iCode = HC_SYSMODALOFF then  canPlay := 1
  38.   else if ((canPlay = 1 ) and (iCode = HC_GETNEXT)) then
  39.   begin
  40.     if bDelay then
  41.     begin
  42.       bDelay := False;
  43.       Result := 50;
  44.     end;
  45.     pEventMSG(lParam)^ := EventArr[PlayLog];
  46.   end
  47.   else if ((canPlay = 1) and (iCode = HC_SKIP)) then
  48.   begin
  49.     bDelay  := True;
  50.     PlayLog := PlayLog + 1;
  51.   end;
  52.   if PlayLog >= EventLog then
  53.   begin
  54.     UnHookWindowsHookEx(hPlay);
  55.   end;
  56. end;

  57. function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
  58. begin
  59.   recOK := 1;
  60.   Result := 0;

  61.   if iCode < 0 then  Result := CallNextHookEx(hHook, iCode, wParam, lParam)
  62.   else if iCode = HC_SYSMODALON  then  recOK := 0
  63.   else if iCode = HC_SYSMODALOFF then  recOK := 1
  64.   else if ((recOK > 0) and (iCode = HC_ACTION)) then
  65.   begin
  66.     EventArr[EventLog] := pEventMSG(lParam)^;
  67.     EventLog := EventLog + 1;

  68.     if EventLog >= 1000 then
  69.     begin
  70.       UnHookWindowsHookEx(hHook);
  71.     end;
  72.   end;
  73. end;

  74. procedure TForm1.FormCreate(Sender: TObject);
  75. begin
  76.   Button1.Caption := '紀錄';
  77.   Button2.Caption := '停止';
  78.   Button3.Caption := '回放';
  79.   Button2.Enabled := False;
  80.   Button3.Enabled := False;
  81. end;

  82. procedure TForm1.Button1Click(Sender: TObject);
  83. begin
  84.   EventLog := 0;
  85.   //建立鍵盤滑鼠操作消息紀錄鏈
  86.   hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0);
  87.   Button2.Enabled := True;
  88.   Button1.Enabled := False;
  89. end;

  90. procedure TForm1.Button2Click(Sender: TObject);
  91. begin
  92.   UnHookWindowsHookEx(hHook);
  93.   hHook := 0;

  94.   Button1.Enabled := True;
  95.   Button2.Enabled := False;
  96.   Button3.Enabled := True;
  97. end;

  98. procedure TForm1.Button3Click(Sender: TObject);
  99. begin
  100.   PlayLog := 0;
  101.   //建立鍵盤滑鼠操作消息紀錄回放鏈
  102.   hPlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, PlayProc, HInstance,0);

  103.   Button3.Enabled:=False;
  104. end;

  105. end.
複製代碼
代码添加完毕后,运行程序,点击“纪录”按钮开始纪录操作,这时你可以在文本控件中输入一些文字或者点击“范例”按钮,然后点击“停止”按钮停止纪录,再点击“回放”按钮就可以讲先前所做的操作回放。

在上面的程序中,HookProc 是纪录操作的消息函数,每当有鼠标键盘消息发生时,系统都会调用该函数,消息信息就保存在地址 lParam 中,我们可以讲消息保存在一个数组中。PlayProc 是消息回放函数,当系统可以执行消息回放时调用该函数,程序就将先前纪录的消息值返回到 lParam 指向的区域中,系统就会执行该消息,从而实现了消息回放。
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-4-30 23:43 , Processed in 0.015083 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.