把delphi的日誌鉤子的改爲c++builder的版本。

以前一直用c++builder,現在資料越來越少,很多資料都只能用delphi裏面的轉換過來,前陣子剛看到一個delphi版本的日值鉤子,剛好借鑑一下。


                                delphi 版本

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    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;


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.


                            c++builder 版本

//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
EVENTMSG EventArr[1000];
int EventLog;
int PlayLog;
HHOOK hHook,hPlay;
int recOK;
int canPlay;
bool bDelay;
int Result;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------
LRESULT CALLBACK PlayProc(int iCode,WPARAM wParam,LPARAM lParam)
{

 canPlay=1;
 if (iCode< 0)
 { return CallNextHookEx(hPlay,iCode,wParam,lParam);}

 if(iCode==HC_SYSMODALON)
      { canPlay=0 ;  }

 if(iCode== HC_SYSMODALOFF)
     { canPlay=1 ; }

 if(iCode==HC_GETNEXT)
    { if(canPlay==1)
     { bDelay=false;
       Sleep(100);
       EVENTMSG* pem = (EVENTMSG*)lParam;
      *pem=EventArr[PlayLog];
      }
     }

 if(iCode==HC_SKIP)
   { if(canPlay==1)
    { bDelay=true;
     PlayLog+=1;
     }
     if (PlayLog>=EventLog)
     {
     UnhookWindowsHookEx(hPlay);
     }
    }
    return 0;
 }

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{

  Button1->Caption="紀錄";
  Button2->Caption="停止";
  Button3->Caption="回放";
  Button4->Caption="範例";
  Button2->Enabled=false;
  Button3->Enabled=false;
}

//---------------------------------------------------
LRESULT CALLBACK HookProc(int iCode,WPARAM wParam,LPARAM lParam)
{
  recOK=1;
  if(iCode< 0)
  { Result=CallNextHookEx(hHook,iCode,wParam,lParam); }

  if(iCode==HC_SYSMODALON )
       recOK=0;

 if(iCode==HC_SYSMODALOFF)
        recOK=1;

 if(iCode==HC_ACTION)
    {  if(recOK>0)
       {EVENTMSG* pm = (EVENTMSG*)lParam;
        EventArr[EventLog]=*pm;
        EventLog+=1;
       if (EventLog>=1000)
         UnhookWindowsHookEx(hHook);
        }
    }
  return 0;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 UnhookWindowsHookEx(hHook);
 hHook=NULL;
 Button1->Enabled=true;
 Button2->Enabled=false;
 Button3->Enabled=true;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
PlayLog=0;
hPlay=SetWindowsHookEx(WH_JOURNALPLAYBACK,(HOOKPROC)PlayProc,
HInstance,0);
Button3->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  EventLog=0;
  hHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,HInstance,0);
  Button2->Enabled=true;
  Button1->Enabled=false;
}
//---------------------------------------------------------------------------

發佈了24 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章