win32下的系统日志钩子示例程序(Delphi 版)

原创 2001年06月27日 20:33:00
{
   win9X,NT,w2k 中的系统日志钩子示例程序(Delphi 版)
   -----------------------------------------------------
   windows下的日志钩子是一种很有用的HOOK类型,他不需要动态链接库*.DLL,就能实现
   系统级的事件监控,它只能监视两种硬件的事件,即鼠标,键盘的操作,而不能监视其它
   消息,被记录的消息可以用日志回放钩子将它还原,下面这个程序用Delphi设计,没有
   用delphi的控件,只用了win32 api,所以通用于Delphi的任何版本,当然你也可以用c
   来实现,有看不懂的可以写信给我,这是第一版,可能有BUG,大家发现了通知我一下,欢
   迎大家和我一起来讨论HOOK技术:
   -----------------------------------------------------
       First Created:njhhack  2001.6.14  (ver1.0)
       电子信箱:njhhack@21cn.com
       主页:hotsky.363.net
}
Program Journal;
//包含如下头文件
uses windows,messages,sysutils;
{$r *.res}  //使用资源文件
//定义一个新的结构类型
type
 TWin = record
   Msg:TMsg;                  
   wClass:TWndClass;
   hMain:integer;
   lr:trect;
   tem:TEVENTMSG;
 end;
var
 Win:TWin;                    //结构变量
 HHJournalRecordProc:integer;  //日志钩子句柄
//将字符串str写到文件c:/key.txt中  
procedure SaveInfo(str:string);stdcall;
var
 f:textfile;
 fname:string;
begin
 fname:='c:/key.txt';
 assignfile(f,fname);
 if fileexists(fname)=false then rewrite(f)
 else append(f);
 writeln(f,str);
 closefile(f);
end;

//将信息写到屏幕
procedure writestr;
var
 hdc:integer;
 str:string;
begin
 hdc:=getdc(win.hmain);
 RoundRect(hdc,10,10,240,140,12,8);
 with win.tem do
 begin
   str:=format('窗口句柄=%x',[hwnd]);
   textout(hdc,30,24*1,pchar(str),length(str));
   str:=format('鼠标位置=(%d,%d)',[paraml,paramh]);
   textout(hdc,30,24*2,pchar(str),length(str));
   str:=format('消息类型=%x',[message]);
   textout(hdc,30,24*3,pchar(str),length(str));
   str:=format('时间=%d',[time div 1000]);
   textout(hdc,30,24*4,pchar(str),length(str));
 end;
 releasedc(win.hmain,hdc);
end;
//日志钩子的回调函数
function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
 win.tem:=TEVENTMSG(PEVENTMSG(lParam)^);
 if nCode>=0 then
 begin
   with win.tem do
   begin
     with win.lr do
     begin
       left:=10;
       top:=10;
       right:=240;
       bottom:=140;
     end;
     InvalidateRect(win.hmain,@win.lr,false);
     if message=wm_lbuttondown then
     begin
       SaveInfo(format('窗口句柄=%x,鼠标位置=(%d,%d),消息类型=WM_LBUTTONDOWN,时间=%d',[hwnd,paraml,paramh,time div 1000]));
     end;
   end;
 end;
 Result:=CallNextHookEx(HHJournalRecordProc,nCode,wParam,lParam); //调用下一个钩子
end;
//钩子设置和删除函数
procedure SetHook(fSet:boolean);
begin
 if fSet=true then
 begin
   if HHJournalRecordProc=0 then HHJournalRecordProc:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalRecordProc,hinstance,0);
 end else
 begin
   if HHJournalRecordProc<>0 then UnhookWindowsHookEx(HHJournalRecordProc);
 end;
end;
//主程序的回调函数
function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall;
begin
 Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
 case Msg of
 wm_paint:writestr;
 wm_destroy:begin SetHook(False);halt;end;
 end;
end;
//主程序的执行函数
procedure run;stdcall;
begin
 win.wClass.hInstance:=    hInstance;
 with win.wclass do
 begin
   hIcon:=        LoadIcon(hInstance,'MAINICON');
   hCursor:=      LoadCursor(0,IDC_ARROW);
   hbrBackground:= COLOR_BTNFACE+1;
   Style:=        CS_PARENTDC;
   lpfnWndProc:=  @WindowProc;
   lpszClassName:='JournalRecordHook';
 end;
 RegisterClass(win.wClass);
 win.hmain:=CreateWindow(win.wClass.lpszClassName,'系统日志钩子演示程序',WS_VISIBLE or WS_OVERLAPPEDWINDOW,10,10,260,180,0,0,hInstance,nil);
 SetHook(true);
 while(GetMessage(win.Msg,win.hmain,0,0))do
 begin
   TranslateMessage(win.Msg);
   DispatchMessage(win.Msg);
 end;
end;

begin
 run;  //开始运行主程序
end.


重温WIN32 API ------ C++日志类的实现

开发程序时,记录运行状态对于调试非常重要,从最简单好用的printf(),到VC++环境提供的TRACE宏,都是开发者的得力助手。其实打印记录程序运行状态的重要性还应该更加重要,不仅开发时,而且在部署...
  • smstong
  • smstong
  • 2014年12月22日 18:26
  • 3322

SetWindowsHookEx为某个进程安装钩子

HMODULE GetModuleHandle (LPCTSTRlpModuleName); 功能说明 获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中,否...
  • hczhiyue
  • hczhiyue
  • 2014年01月18日 15:28
  • 5570

Windows Hook钩子机制及键盘钩子实例(转)

本文将试图以下面的顺序讲解HOOK的大部分内容:  1、 WINDOWS的消息机制  2、 HOOK介绍  3、 HOOK链  4、 HOOK钩子的作用范围  5、 HOOK类...
  • X___V
  • X___V
  • 2013年02月17日 15:21
  • 3745

一个用Delphi6做的写日志文件的示例程序

  • 2008年11月11日 17:35
  • 281KB
  • 下载

Delphi应用程序日志写入系统日志

原文地址 1、首先要写一个文本类型的消息文件,格式如下: //==== 文件格式 SystemLog.mc========= LanguageNames=(English=0x409:L...
  • andrew57
  • andrew57
  • 2013年04月14日 00:31
  • 2077

Delphi应用程序日志写入系统日志

1、首先要写一个文本类型的消息文件,格式如下: //==== 文件格式 SystemLog.mc========= LanguageNames=(English=0x409:LicenseServ...
  • mypqx
  • mypqx
  • 2012年09月27日 21:05
  • 2610

鼠标和键盘钩子示例程序

  • 2010年11月01日 09:51
  • 1.95MB
  • 下载

Delphi小型示例程序所涉及到的N多问题及解决办法

在年前1月13日接到使用delphi示例任务,上大学时就听说过有这么个语言而已,我也在大学图书馆里见过,貌似和用英语学句子一样。记得笔记深的是if 什么什么then,好了言归正传。 1、开始进行de...
  • Dead_Cicle
  • Dead_Cicle
  • 2012年02月09日 13:14
  • 929

win sock 示例程序客户端-服务器端 c++版

  • 2014年09月17日 10:58
  • 11.66MB
  • 下载

win7系统日志分支删除方法

之前电脑装过德国的叫啥子软件来着,当时在系统自动创建了日志,后来软件卸载了,发现还是有这个日志主键,(我有强迫症)心里不爽,干了这丫的 打开这个路径 C:\Windows\System32\wine...
  • u012385481
  • u012385481
  • 2014年01月16日 12:13
  • 784
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:win32下的系统日志钩子示例程序(Delphi 版)
举报原因:
原因补充:

(最多只允许输入30个字)