----------这是*.dll中的单元--------------- unit HookProc;
interface
uses windows,messages,sysutils;
const HTName:array[1..13] of pchar=( ''''CALLWNDPROC'''',''''CALLWNDPROCRET'''',''''CBT'''',''''DEBUG'''',''''GETMESSAGE'''',''''JOURNALPLAYBACK'''', ''''JOURNALRECORD'''',''''KEYBOARD'''',''''MOUSE'''',''''MSGFILTER'''',''''SHELL'''',''''SYSMSGFILTER'''',''''FOREGROUNDIDLE'''' );
function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
implementation
procedure SaveInfo(k:integer;str:string);stdcall; var f:textfile; WorkPath:string; begin WorkPath:=ExtractFilePath(ParamStr(0)); assignfile(f,WorkPath+''''Records.txt''''); if fileexists(WorkPath+''''Records.txt'''')=false then rewrite(f) else append(f); //if strcomp(pchar(str),pchar(''''#13#10''''))=0 then writeln(f,'''''''') //else write(f,str); writeln(f,HTName[k]+''''----''''+str); closefile(f); end;
function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:TCWPSTRUCT; begin pcs:=TCWPSTRUCT(PCWPSTRUCT(lParam)^); if nCode>=0 then begin if pcs.message=wm_lbuttonup then SaveInfo(1,format(''''hwnd=%x'''',[pcs.hwnd])); end; Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; var pcs:TMSG; begin pcs:=TMSG(PMSG(lParam)^); if nCode>=0 then begin if pcs.message=wm_lbuttonup then SaveInfo(5,format(''''hwnd=%x'''',[pcs.hwnd])); end; Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end; // function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; begin Result:=CallNextHookEx(0,nCode,wParam,lParam); end;
uses windows,messages,sysutils, HookProc in ''''HookProc.pas'''';
{$r *.res}
const
HookMemFileName=''''DllHookMemFile.DTA''''; HTName:array[1..13] of pchar=( ''''CALLWNDPROC'''',''''CALLWNDPROCRET'''',''''CBT'''',''''DEBUG'''',''''GETMESSAGE'''',''''JOURNALPLAYBACK'''', ''''JOURNALRECORD'''',''''KEYBOARD'''',''''MOUSE'''',''''MSGFILTER'''',''''SHELL'''',''''SYSMSGFILTER'''',''''FOREGROUNDIDLE'''' );
type THookProc = function(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall; PShared=^TShared; THook = record HookHand:HHook; HookType:integer; HookProc:THookProc; end; TShared = record Hook:array [0..16] of THook; Father,Self:integer; Count:integer; hinst:integer; end; TWin = record Msg:TMsg; wClass:TWndClass; hMain:integer; end; var MemFile:THandle; Shared:PShared; Win:TWin; wmhook:integer;
procedure SaveInfo(k:integer;str:string);stdcall; var f:textfile; WorkPath:string; begin WorkPath:=ExtractFilePath(ParamStr(0)); assignfile(f,WorkPath+''''Records.txt''''); if fileexists(WorkPath+''''Records.txt'''')=false then rewrite(f) else append(f); //if strcomp(pchar(str),pchar(''''#13#10''''))=0 then writeln(f,'''''''') //else write(f,str); writeln(f,HTName[k]+''''----''''+str); closefile(f); end;
procedure InitHookData; var k:integer; begin with Shared^ do begin for k:=0 to 14 do Hook[k].HookHand:=0; // Hook[0].HookType:=WH_CALLWNDPROC; Hook[0].HookProc:=@CallWndProc; // Hook[1].HookType:=WH_CALLWNDPROCRET; Hook[1].HookProc:=@CallWndRetProc; // Hook[2].HookType:=WH_CBT; Hook[2].HookProc:=@CBTProc; // Hook[3].HookType:=WH_DEBUG; Hook[3].HookProc:=@DebugProc; // Hook[4].HookType:=WH_GETMESSAGE; Hook[4].HookProc:=@GetMsgProc; // Hook[5].HookType:=WH_JOURNALPLAYBACK; Hook[5].HookProc:=@JournalPlaybackProc; // Hook[6].HookType:=WH_JOURNALRECORD; Hook[6].HookProc:=@JournalRecordProc; // Hook[7].HookType:=WH_KEYBOARD; Hook[7].HookProc:=@KeyboardProc; // Hook[8].HookType:=WH_MOUSE; Hook[8].HookProc:=@MouseProc; // Hook[9].HookType:=WH_MSGFILTER; Hook[9].HookProc:=@MessageProc; // Hook[10].HookType:=WH_SHELL ; Hook[10].HookProc:=@ShellProc; // Hook[11].HookType:=WH_SYSMSGFILTER; Hook[11].HookProc:=@SysMsgProc; // Hook[12].HookType:=WH_FOREGROUNDIDLE; Hook[12].HookProc:=@ForegroundIdleProc;
end; end;
function SetHook(fSet:boolean;HookId:integer):bool;stdcall; begin with shared^ do if fSet=true then begin if Hook[HookId].HookHand=0 then begin Hook[HookId].HookHand:=SetWindowsHookEx(Hook[HookId].HookType,Hook[HookId].HookProc,hinstance,0); if Hook[HookId].HookHand<>0 then Result:=true else Result:=false; end else Result:=true; end else begin if Hook[HookId].HookHand<>0 then begin if UnhookWindowsHookEx(Hook[HookId].HookHand)=true then begin Hook[HookId].HookHand:=0; Result:=true; end else Result:=false; end else Re