国产黄色免费网站,人人干人人干人人干,免费大黄网站在线看,国产情侣一区二区三区,99精品国产福利免费一区二区,国产亚洲成归v人片在线观看,伊人88

2023信創(chuàng)獨(dú)角獸企業(yè)100強(qiáng)
全世界各行各業(yè)聯(lián)合起來,internet一定要實(shí)現(xiàn)!

建立鍵盤鼠標(biāo)動作紀(jì)錄與回放

2004-02-14 eNet&Ciweek

  很多的教學(xué)軟件或系統(tǒng)監(jiān)視軟件可以自動記錄回放用戶的輸入文字或點(diǎn)擊按鈕等操作操作,這個(gè)功能的實(shí)現(xiàn)是使用了Windows的Hook函數(shù)。Windows提供API函數(shù)SetwindowsHookEx來建立一個(gè)Hook,通過這個(gè)函數(shù)可以將一個(gè)程序添加到Hook鏈中監(jiān)視Windows消息,函數(shù)語法為:

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

   其中參數(shù)idHook指定建立的監(jiān)視函數(shù)類型。通過Windows MSDN幫助可以看到,SetwindowsHookEx函數(shù)提供15種不同

  的消息監(jiān)視類型,在這里我們將使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK來監(jiān)視鍵盤和鼠標(biāo)操作。參數(shù)lpfn指定消息函數(shù),在相應(yīng)的消息產(chǎn)生后,系統(tǒng)會調(diào)用該函數(shù)并將消息值傳遞給該函數(shù)供處理。函數(shù)的一般形式為:

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

   其中code為系統(tǒng)指示標(biāo)記,wParam和lParam為附加參數(shù),根據(jù)不同的消息監(jiān)視類型而不同。只要在程序中建立這樣一個(gè)函數(shù)再通過SetwindowsHookEx函數(shù)將它加入到消息監(jiān)視鏈中就可以處理消息了。

   在不需要監(jiān)視系統(tǒng)消息時(shí)需要調(diào)用提供UnHookWindowsHookEx來解除對消息的監(jiān)視。

   WH_JOURNALRECORD和WH_JOURNALPLAYBACK類型是兩種相反的Hook類型,前者獲得鼠標(biāo)、鍵盤動作消息,后者回放鼠標(biāo)鍵盤消息。所以在程序中我們需要建立兩個(gè)消息函數(shù),一個(gè)用于紀(jì)錄鼠標(biāo)鍵盤操作并保存到一個(gè)數(shù)組中,另一個(gè)用于將保存的操作返給系統(tǒng)回放。

   下面來建立程序,在Delphi中建立一個(gè)工程,在Form1上添加3個(gè)按鈕用于程序操作。另外再添加一個(gè)按鈕控件和一個(gè)Edit控件用于驗(yàn)證操作。下面是Form1的全部代碼 

  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;

   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 //必須將消息傳遞到消息鏈的下一個(gè)接受單元

   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:='紀(jì)錄';

   Button2.Caption:='停止';

   Button3.Caption:='回放';

   Button4.Caption:='范例';

   Button2.Enabled:=False;

   Button3.Enabled:=False;

  end;  

  procedure TForm1.Button1Click(Sender: TObject);

  begin

   EventLog:=0;

   //建立鍵盤鼠標(biāo)操作消息紀(jì)錄鏈

   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;

   //建立鍵盤鼠標(biāo)操作消息紀(jì)錄回放鏈

   hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,

   HInstance,0);

   Button3.Enabled:=False;

  end;  

  end.  

   代碼添加完畢后,運(yùn)行程序,點(diǎn)擊“紀(jì)錄”按鈕開始紀(jì)錄操作,這時(shí)你可以在文本控件中輸入一些文字或者點(diǎn)擊“范例”按鈕,然后點(diǎn)擊“停止”按鈕停止紀(jì)錄,再點(diǎn)擊“回放”按鈕就可以講先前所做的操作回放。在上面的程序中,HookProc是紀(jì)錄操作的消息函數(shù),每當(dāng)有鼠標(biāo)鍵盤消息發(fā)生時(shí),系統(tǒng)都會調(diào)用該函數(shù),消息信息就保存在地址lParam中,我們可以講消息保存在一個(gè)數(shù)組中。PlayProc是消息回放函數(shù),當(dāng)系統(tǒng)可以執(zhí)行消息回放時(shí)調(diào)用該函數(shù),程序就將先前紀(jì)錄的消息值返回到lParam指向的區(qū)域中,系統(tǒng)就會執(zhí)行該消息,從而實(shí)現(xiàn)了消息回放。

相關(guān)頻道: eNews

您對本文或本站有任何意見,請?jiān)谙路教峤?,謝謝!

投稿信箱:tougao@enet16.com