鼠标钩子

dll

--------------------------------

unit mouseHookdll;


interface


uses  Winapi.Windows, Winapi.Messages, System.SysUtils,System.SysConst,UnitHookConst;


var
  hmappingfile:THandle;
  pshmem:PShareMem;
  firstProcess:boolean;
  nexthook:hhook;




function starthook(sender:HWND;messageid:word):bool;stdcall;
function stophook:bool;stdcall;
procedure getrbutton;stdcall;


implementation


procedure getrbutton;stdcall;
begin
  pshmem^.IfRbutton:=true;
end;


function hookHandler(icode:integer;wparam:WPARAM;lparam:LPARAM):LRESULT; stdcall;export;
begin
  result:=0;
  if icode<0 then
    callnexthookex(nexthook,icode,wparam,lparam);
  case wparam of
  WM_LBUTTONDOWN :
    begin


    end;
  WM_LBUTTONUP:
    begin


    end;
  WM_LBUTTONDBLCLK:
    begin


    end;
  WM_RBUTTONDOWN:
    begin
      if pshmem^.IfRbutton then
      begin
         pshmem^.IfRbutton:=false;
         pshmem^.data2:=pmousehookstruct(lparam)^;
         getwindowtext( pshmem^.data2.hwnd,pshmem^.buffer,1024);
         sendmessage(pshmem^.data1[1],pshmem^.data1[2]+1,wparam,integer(@(pshmem^.data2)));
      end;


    end;
  WM_NCMOUSEMOVE,WM_MOUSEMOVE:
    begin
      pshmem^.data2:= pmousehookstruct(lparam)^;
      getwindowtext( pshmem^.data2.hwnd,pshmem^.buffer,1024);
      sendmessage(pshmem^.data1[1],pshmem^.data1[2],wparam,integer(@(pshmem^.data2)));
    end;
  end;     //case end


end;


function starthook(sender:HWND;messageid:word):bool;stdcall;
begin
  result:=false;
  if nexthook<>0 then  exit;
  pshmem^.data1[1]:=sender;
  pshmem^.data1[2]:=messageid;
  nexthook:=setwindowshookex(wh_mouse,hookhandler,hinstance,0);
  result:=nexthook<>0;
end;


function stophook:bool;stdcall;     //暂停
begin
  if nexthook<>0 then
  begin
    unhookwindowshookex(nexthook);
    nexthook:=0;
  end;
  result:=(nexthook=0);
end;
exports
   starthook, stophook, getrbutton;
//进程初始化
initialization
  hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
  if hMappingFile=0 then
  begin
    hMappingFile := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShareMem),MappingFileName);
    FirstProcess:=true;
  end
  else  FirstProcess:=false;
  if hMappingFile=0 then  exception.Create('不能建立共享内存');
  pShMem :=  MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0);
  if pShMem = nil then
  begin
    CloseHandle(hMappingFile);
    Exception.Create('不能映射共享内存!');
  end;
  if FirstProcess then
  begin
     pShmem^.IfRbutton := false;
  end;
  NextHook:=0;
finalization
   UnMapViewOfFile(pShMem);
   CloseHandle(hMappingFile);


end.




测试的程序

--------------------------------------


unit mousetest;


interface


uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,UnitHookConst;


type
  TForm6 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    Panel1: TPanel;
    Edit4: TEdit;
    Label1: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure wndproc(var messages:TMessage);override;
  end;


var
  Form6: TForm6;
  hmappingFile:THandle;
  pshmem :PShareMem;
const
  message_id=WM_USER+100;
implementation


{$R *.dfm}
function starthook(sender:HWND;MessageID:word):bool;stdcall;external 'mouseDll.dll';
function stophook:bool;stdcall;external 'mouseDll.dll';
procedure getrbutton;  stdcall;external 'mouseDll.dll';


procedure TForm6.Button1Click(Sender: TObject);
begin
  if button1.Caption='开始' then
  begin
    if starthook(form6.Handle,message_id) then   //开始截取,传递本窗口句柄,及信息id,当处理指定鼠标信息时,系统钩子向本程(form6.handle)发送信息(messageid)
       button1.Caption:='停止';
  end else
  begin
    if stophook then
      button1.Caption:='开始';
  end;


end;


procedure TForm6.Button2Click(Sender: TObject);
begin
  if button1.Caption<>'开始' then
  begin
    edit4.Text:='';
    edit5.Text:='';
    edit6.Text:='';
    getrbutton;
  end;


end;


procedure TForm6.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if button1.Caption='开始' then
  begin


  end else
  begin
    if stophook then
      button1.Caption:='开始';


  end;


end;


procedure TForm6.FormCreate(Sender: TObject);
begin
    pshmem:=nil;
end;


procedure TForm6.WndProc(var messages: TMessage);
var
  x,y:integer;
  s:array[0..255] of char;
begin
  if pshmem=nil then
  begin
    hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
    if hMappingFile=0 then Exception.Create('不能建立共享内存!');
    pShMem :=  MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0);
    if pShMem = nil then
    begin
        CloseHandle(hMappingFile);
        Exception.Create('不能映射共享内存!');
    end;
  end;
  if pShMem = nil then exit;
  if Messages.Msg = message_id then
  begin
    x:=pShMem^.data2.pt.x;
    y:=pShMem^.data2.pt.y;
    edit3.text:='HWND:'+inttostr(pShMem^.data2.hwnd);
    panel1.caption:='x='+inttostr(x)+' y='+inttostr(y);
    edit2.text:='WindowsText:'+string(pShMem^.buffer);
    getClassName(pShMem^.data2.hwnd,s,255);
    edit1.text:='ClassName:"'+string(s)+'"';
  end
  else if Messages.Msg = message_id+1 then
  begin
    edit4.text:=inttostr(pShMem^.data2.hwnd);
    edit5.text:='WindowsText:'+string(pShMem^.buffer);
    getClassName(pShMem^.data2.hwnd,s,255);
    edit6.text:='ClassName:"'+string(s)+'"';
  end
  else Inherited;


end;


end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值