library dllMouse;
uses
SysUtils,
Classes,
UnitHookDLL in 'UnitHookDLL.pas',
UnitHookConst in 'UnitHookConst.pas'; {$R *.res}
{ function StartHook(sender : HWND;MessageID : WORD) : BOOL; stdcall;
function StopHook: BOOL; stdcall;
procedure GetRbutton; stdcall;} exports
StartHook, StopHook,GetRbutton; begin
end. {
截获鼠标消息例子.
截获所有进程的鼠标消息,需要用到系统钩子,即要用到dll才能够截取,因此挂
钩函数封装在dll动态链接库中.由于需要跨进程共享数据,所以在dll使用内存映像
文件来共享数据.
}
unit UnitHookDLL;
// download by http://www.codefans.net
interface uses Windows, Messages, Dialogs, SysUtils,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 := ;
If iCode < Then Result := 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,);
SendMessage(pShMem^.data1[],pShMem^.data1[]+,wParam,integer(@(pShMem^.data2)) );
// 窗口 消息 坐标
end;
end;
WM_RBUTTONUP:
begin
end;
WM_RBUTTONDBLCLK:
begin
end;
WM_MBUTTONDOWN:
begin
end;
WM_MBUTTONUP:
begin
end;
WM_MBUTTONDBLCLK:
begin
end;
WM_NCMouseMove, WM_MOUSEMOVE:
begin
pShMem^.data2:=pMOUSEHOOKSTRUCT(lparam)^;
getwindowtext(pShMem^.data2.hwnd,pShMem^.buffer,);
SendMessage(pShMem^.data1[],pShMem^.data1[],wParam,integer(@(pShMem^.data2)) );
// 窗口 消息 坐标
end;
end;
end; function StartHook(sender : HWND;MessageID : WORD) : BOOL;
function GetModuleHandleFromInstance: THandle;
var
s: array[..] of char;
begin
GetModuleFileName(hInstance, s, sizeof(s)-);
Result := GetModuleHandle(s);
end;
begin
Result := False;
if NextHook <> then Exit;
pShMem^.data1[]:=sender;
pShMem^.data1[]:=messageid;
NextHook :=
SetWindowsHookEx(WH_mouse, HookHandler, HInstance, ); //全局
//SetWindowsHookEx(WH_mouse, HookHandler, GetModuleHandleFromInstance, GetCurrentThreadID); //实例
Result := NextHook <> ;
end; function StopHook: BOOL;
begin
if NextHook <> then
begin
UnhookWindowshookEx(NextHook);
NextHook := ;
//SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
end;
Result := NextHook = ;
end; initialization
hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
if hMappingFile= then
begin
hMappingFile := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,,SizeOf(TShareMem),MappingFileName);
FirstProcess:=true;
end
else FirstProcess:=false;
if hMappingFile= then Exception.Create('不能建立共享内存!'); pShMem := MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,,,);
if pShMem = nil then
begin
CloseHandle(hMappingFile);
Exception.Create('不能映射共享内存!');
end;
if FirstProcess then
begin
pShmem^.IfRbutton := false;
end;
NextHook:=;
finalization
UnMapViewOfFile(pShMem);
CloseHandle(hMappingFile); end. unit Unitmain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,UnitHookConst; type
TForm1 = class(TForm)
edt1: TEdit;
edt2: TEdit;
capture: TButton;
edt3: TEdit;
btn2: TButton;
lbl1: TLabel;
edt4: TEdit;
edt5: TEdit;
edt6: TEdit;
pnl1: TPanel;
procedure captureClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
procedure WndProc(var Messages: TMessage); override;
end; var
Form1: TForm1;
hMappingFile : THandle;
pShMem : PShareMem;
const MessageID = WM_User + ; implementation {$R *.DFM}
//dllMouse.dll DllMouse.DLL
function StartHook(sender : HWND;MessageID : WORD) : BOOL;stdcall; external 'dllMouse.dll';
function StopHook: BOOL;stdcall; external 'dllMouse.dll';
procedure GetRbutton; stdcall; external 'dllMouse.dll'; procedure TForm1.captureClick(Sender: TObject);
begin
if capture.caption='开始' then
begin
if StartHook(Form1.Handle,MessageID) then
capture.caption:='停止';
end
else begin
if StopHook then
capture.caption:='开始';
end;
end; procedure TForm1.btn2Click(Sender: TObject);
begin
if capture.caption<>'开始' then
begin
edt4.text:='';
edt5.text:='';
edt6.text:='';
GetRbutton;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
pShMem := nil;
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if capture.caption='开始' then
begin
end
else begin
if StopHook then
capture.caption:='开始';
end;
end; procedure TForm1.WndProc(var Messages: TMessage);
var
x,y:integer;
s:array[..]of char;
begin
if pShMem = nil then
begin
hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
if hMappingFile= then Exception.Create('不能建立共享内存!');
pShMem := MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,,,);
if pShMem = nil then
begin
CloseHandle(hMappingFile);
Exception.Create('不能映射共享内存!');
end;
end;
if pShMem = nil then exit;
if Messages.Msg = MessageID then
begin
x:=pShMem^.data2.pt.x;
y:=pShMem^.data2.pt.y;
edt3.text:='HWND:'+inttostr(pShMem^.data2.hwnd);
pnl1.caption:='x='+inttostr(x)+' y='+inttostr(y);
edt2.text:='WindowsText:'+string(pShMem^.buffer);
getClassName(pShMem^.data2.hwnd,s,);
edt1.text:='ClassName:"'+string(s)+'"';
end
else if Messages.Msg = MessageID+ then
begin
edt4.text:=inttostr(pShMem^.data2.hwnd);
edt5.text:='WindowsText:'+string(pShMem^.buffer);
getClassName(pShMem^.data2.hwnd,s,);
edt6.text:='ClassName:"'+string(s)+'"';
end
else Inherited;
end; end.

hook鼠标的更多相关文章

  1. hook 鼠标键盘消息实例分析

    1.木马控制及通信方法包含:双管道,port重用.反弹技术.Hook技术,今天重点引用介绍一下hook的使用方法,hook信息后能够将结果发送到hacker邮箱等.实现攻击的目的. 转自:http:/ ...

  2. hook鼠标键盘记录和回放

    unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...

  3. WndProc和hook区别

    1)WndProc函数作用:主要在程序中拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数 ...

  4. JavaScript常用的Hook脚本

    JavaScript常用的Hook脚本 本文Hook脚本 来自 包子 页面最早加载代码Hook时机 在source里 用dom事件断点的script断点 然后刷新网页,就会断在第一个js标签,这时候就 ...

  5. Visual C++2010开发权威指南 中文高清PDF - VC.NET

    第一部分  Visual C++ 2010开发与新特性第1章  Visual C++ 2010开发环境简介 11.1  Visual C++ 2010简介 11.2  Visual C++ 2010下 ...

  6. SetWindowsHookEx失败

    使用下面代码hook鼠标 res = SetWindowsHookEx(WH_MOUSE_LL, _mouseHookProcedure, Marshal.GetHINSTANCE(System.Re ...

  7. C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能

    DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...

  8. 分享一个WPF 实现 Windows 软件快捷小工具

    分享一个WPF 实现 Windows 软件快捷小工具 Windows 软件快捷小工具 作者:WPFDevelopersOrg 原文链接:https://github.com/WPFDevelopers ...

  9. c# 使用hook来监控鼠标键盘事件的示例代码

    如果这个程序在10几年前,QQ刚刚兴起的时候,有了这个代码,就可实现盗号了. 当然使用钩子我们更多的是实现"全局快捷键"的需求. 比如 程序最小化隐藏后要"某快捷键&qu ...

随机推荐

  1. 刷题21. Merge Two Sorted Lists

    一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...

  2. mac搭建nginx

    0.介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler ...

  3. java核心-多线程(9)- ThreadLocal类

    1.背景     ThreadLocal类我想一般的码农或初级程序员在平时开发中基本上接触不到,但是面试老师会问.往高级点走会遇到这个类.这个类不是为了解决资源的竞争问题,而是为每个线程提供同一个容器 ...

  4. Centos 8下普通用户增加root权限

    问题:     解决: 重启Centos,使用root登陆:                    

  5. TP框架数据模型

    1.TP框架的数据模型需要建在Model文件夹下: 1.数据模型 与控制器相似,但是每个数据模型控制一张数据表. 2.数据模型可写可不写,如果不写 则沿用父类数据模型. 2.访问数据库: 1.更改数据 ...

  6. js 运行机制简单了解

    一.如何理解 JS 的单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScrip ...

  7. 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

    java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...

  8. 实验吧-杂项-啦啦啦(数据包http导出、图片拼接)

    比较综合的一道题. 1.数据包数据提取 首先下载数据包,一般数据包都是抓取的一些数据,需要对数据进行分析. 用wireshark打开数据包,筛选出http协议的数据,发现有两个是上传的数据: 我们就看 ...

  9. Django实现websocket

    django实现websocket大致上有两种方式,一种channels,一种是dwebsocket.channels依赖于redis,twisted等 一 dwebsocket 1 Django实现 ...

  10. 文件的概念、标准IO其一

    1.文件的概念 文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现. 系统调用.文件IO.标准IO的关系如下: 2.linux系统的文件分 ...