mousep.PAS
上传用户:yhtxzxm
上传日期:2007-01-04
资源大小:169k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Delphi

  1. unit Mousep;
  2. interface
  3. uses
  4.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  5.   Forms, Dialogs, StdCtrls;
  6. {在DLL中也可有FORM型的变量}
  7. type
  8.   TForm1 = class(TForm)
  9.     Label1: TLabel;  {显示wParam}
  10.     Label2: TLabel;  {显示lParam}
  11.     Label3: TLabel;  {显示x,y}
  12.     Label4: TLabel;  {显示hwnd}
  13.     Label5: TLabel;  {显示window text}
  14.     Label6: TLabel;
  15.     Label7: TLabel;  {显示window class}
  16.   private
  17.     { Private declarations }
  18.   public
  19.     { Public declarations }
  20.   end;
  21. function sethook:bool;export;
  22. function unhook:bool;export;
  23. function mouseProc(code:integer;w:integer;l:longint):bool;export;
  24. var
  25.   Form1: TForm1;
  26.   idhook:longint;
  27.   formok:bool;
  28. implementation
  29.  {*********************************************************************
  30.  声明安装函数setWindowsHookEx(),
  31.  在Delphi中如果用函数setWindowsHook()则不需声明。
  32.  微软说函数setWindowsHook已在Windows3.1中废弃,为与Windows3.0兼容仍保留。
  33.  实际上该函数setWindowsHook在Windows3.1和Windows95中仍可使用。
  34.  {*********************************************************************}
  35.  function setwindowsHookEx(id:integer;proc:tfarproc;hinst,htask:thandle):
  36.          longint;far;external 'user';
  37. {$R *.DFM}
  38. {安装鼠标钩子函数mouseProc}
  39. function sethook:bool;
  40. var
  41. hinst:thandle;    {该动态连接库自己的模块局柄}
  42. proc:tfarproc;    {鼠标钩子函数mouseProc的地址}
  43. begin
  44. {在动态连接库中创建form1}
  45. if formok=false then form1:=tform1.create(application) else exit;
  46. formok:=true;{安装form1 后,设置formok,不许再安装form1}
  47. {动态连接库的application指:调用动态连接库的主程序}
  48. form1.show;
  49. {不让用系统菜单来双击关闭Form1}
  50. form1.BorderIcons:=form1.BorderIcons-[biSystemMenu];
  51. hinst:=getModuleHandle('mousedll');
  52. {得到mousedll.dll的模块局柄,即该动态连接库自己的模块局柄}
  53. proc:=getProcAddress(hinst,'mouseProc');
  54. idhook:=setWindowsHookEx(WH_MOUSE,proc,hinst,0);
  55. {用WH_MOUSE参数安装鼠标钩子后,移动鼠标时,系统自动调用mouseProc钩子}
  56. if idhook =0 then sethook:=false else sethook:=true;
  57. end;
  58. {解除鼠标钩子函数mouseProc的安装}
  59. function unhook:bool;
  60. begin
  61. if formok=true then form1.free else exit; {检查form1是否已经关闭}
  62. formok:=false;{关闭了form1,设置formok=0}
  63. if idhook=0 then exit;
  64. unhookWindowsHookEx(idhook);
  65. unhook:=true;
  66. end;
  67. {mouseProc不由应用程序调用,而是在鼠标移动后,由系统调用}
  68. function  mouseProc(code:integer;w:integer;l:longint):bool;
  69. var
  70. p:^TMouseHookStruct;
  71. poff:word;
  72. pseg:word;
  73. pmemo:pchar;
  74. begin
  75. if code<0 then begin
  76.     mouseProc:=true;
  77.     CallNextHookEx(idhook,0,w,l);
  78. end;
  79. if code=HC_NOREMOVE then form1.caption:='HC_NOREMOVE';
  80. form1.caption:='mouse hook';
  81. mouseProc:=false;
  82. {显示系统传来的wParam参数,w是各种鼠标消息的标识符  }
  83. form1.label1.caption:='wParam='+intTostr(w);
  84. {显示系统传来的lParam参数,l是MOUSEHOOKSTRUCT结构的地址}
  85. form1.label2.caption:='lParam='+intTostr(l);
  86. poff:=loword(l);     {得到l的低16位}
  87. pseg:=hiword(l);     {得到l的高16位}
  88. p:=ptr(pseg,poff);   {合成指向MOUSEHOOKSTRUCT结构的指针}
  89. {显示屏幕上鼠标的X,Y坐标}
  90. form1.label3.caption:='pt.x='+intTostr(p^.pt.x)
  91.      +'  pt.y='+intTostr(p^.pt.y);
  92. {显示屏幕上鼠标下的窗口局柄}
  93. form1.label4.caption:='hwnd='+intTostr(P^.hwnd);
  94. pmemo:=stralloc(20);
  95. getWindowText(p^.hwnd,pmemo,20-1);
  96. {显示鼠标下窗口的标题栏}
  97. form1.label5.caption:=strPas(pmemo);
  98. getClassName(p^.hwnd,pmemo,20-1);
  99. {显示鼠标下窗口的类}
  100. form1.label6.caption:=strPas(pmemo);
  101. strDispose(pmemo);
  102. end;
  103. end.