Delphi实现全局鼠标钩子
其中涉及到的一些API,网上均能查到详细的解释,这里不再熬述。源码下载
因为是全局钩子,所以要用dll注入。用到的鼠标消息结构如下:
- PMouseHookStruct = ^TMouseHookStruct;
- {$EXTERNALSYM tagMOUSEHOOKSTRUCT}
- tagMOUSEHOOKSTRUCT = packed record
- pt: TPoint;
- hwnd: HWND;
- wHitTestCode: UINT;
- dwExtraInfo: DWORD;
- end;
- TMouseHookStruct = tagMOUSEHOOKSTRUCT;
DLL代码,Mouse_HookDLL
- library Mouse_HookDLL;
- { Important note about DLL memory management: ShareMem must be the
- first unit in your library's USES clause AND your project's (select
- Project-View Source) USES clause if your DLL exports any procedures or
- functions that pass strings as parameters or function results. This
- applies to all strings passed to and from your DLL--even those that
- are nested in records and classes. ShareMem is the interface unit to
- the BORLNDMM.DLL shared memory manager, which must be deployed along
- with your DLL. To avoid using BORLNDMM.DLL, pass string information
- using PChar or ShortString parameters. }
- uses
- SysUtils,
- Windows,
- Messages,
- Classes;
- {$R *.res}
- var
- NextHook : HHook;
- //调用者的Handle,用来给其发消息
- CallHandle : HWND;
- //通知调用者的消息,由调用者传进来
- MessageID : Word;
- //挂钩子函数 ,这里只处理鼠标移动,其他的鼠标动作,道理一样
- function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
- begin
- Result := 0;
- if code < 0 then
- Result := CallNextHookEx(NextHook,code,wParam,lParam);
- case wParam of
- WM_NCMOUSEMOVE,WM_MOUSEMOVE:
- begin
- //给调用者发消息
- SendMessage(CallHandle,MessageID,wParam,Integer(@pMouseHookStruct(lParam)^));
- end;
- end;
- end;
- //启动钩子
- function StartHook(MsgID:Word):Bool;stdcall;
- begin
- Result := False;
- if NextHook <> 0 then
- Exit;
- MessageID := MsgID;
- //挂钩,SetWindowsHookEx的参数dwThreadId=0,表示挂全局的,不知道为什么,我系统是2003,用WH_MOUSE只能在本进程中实现钩子,WH_MOUSE_LL可以实现全局,在Delphi7中,是没有WH_MOUSE_LL定义的,你可以自己定义,值是14
- NextHook := SetWindowsHookEx(WH_MOUSE_LL,@HookProc,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;
- //传递调用者句柄
- procedure SetCallHandle(sender:HWND);stdcall;
- begin
- CallHandle := sender;
- NextHook := 0;
- end;
- exports
- StartHook name 'StartHook',
- StopHook name 'StopHook',
- SetCallHandle name 'SetCallHandle';
- begin
- end.
调用者代码,HookTest
- unit HookTest;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TfrmHookTest = class(TForm)
- Label1: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- private
- { Private declarations }
- //重载消息处理
- procedure WndProc(var Message: TMessage);override;
- public
- { Public declarations }
- end;
- var
- frmHookTest: TfrmHookTest;
- const
- WM_TestMsg = WM_User + 100;
- implementation
- {$R *.dfm}
- function StartHook(MsgID:Word):Bool;stdcall;external 'Mouse_HookDLL.dll';
- function StopHook:Bool;stdcall;external 'Mouse_HookDLL.dll';
- procedure SetCallHandle(sender:HWND);stdcall;external 'Mouse_HookDLL.dll';
- procedure TfrmHookTest.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- StopHook;
- end;
- procedure TfrmHookTest.FormCreate(Sender: TObject);
- begin
- SetCallHandle(Self.Handle);
- if not StartHook(WM_TestMsg) then
- begin
- ShowMessage('挂钩失败!');
- end;
- end;
- procedure TfrmHookTest.WndProc(var Message: TMessage);
- var
- x,y:integer;
- begin
- //得到符合条件的钩子
- if Message.Msg = WM_TestMsg then
- begin
- x := pMouseHookStruct(Message.LParam)^.pt.X;
- y := pMouseHookStruct(Message.LParam)^.pt.Y;
- //显示x,y坐标
- Self.Label1.Caption := '鼠标当前位置:x='+IntToStr(x)+' : y='+IntToStr(y);
- end;
- inherited;
- end;
- end.
运行结果

http://blog.csdn.net/bdmh/article/details/5888287
Delphi实现全局鼠标钩子的更多相关文章
- 全局鼠标钩子:WH_MOUSE_LL, 在【 win 10 上网本】上因为太卡,运行中丢失全局鼠标钩子
一台几年前买的上网本,让我安装了一个 win 10,然后用来测试程序的时候, 发现 使用 SetWindowsHookEx(WH_MOUSE_LL, mouseHook, GetModuleHandl ...
- 用Delphi实现Windows的鼠标钩子函数
Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...
- c#全局鼠标事件以及鼠标事件模拟
最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...
- 在C#中使用全局鼠标、键盘Hook
今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...
- 如何在C#中使用全局鼠标、键盘Hook
今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...
- HOOK API (一)——HOOK基础+一个鼠标钩子实例
HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...
- VC6 鼠标钩子 最简单样例
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...
- C#全局鼠标键盘Hook
原文出自:http://www.cnblogs.com/iEgrhn/archive/2008/02/17/1071392.html using System; using System.Collec ...
- C#键盘钩子 鼠标钩子
最新对C#模拟键盘按键,鼠标操作产生了兴趣.特从网上收集了一些常用的API用来调用键盘,鼠标操作. class Win32API { #region DLL导入 /// <summary> ...
随机推荐
- oracle 集合定义
集合:是具有相同定义的元素的聚合.Oracle有两种类型的集合: 可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值. 嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限 ...
- 使用Python管理Azure(1):基础配置
Azure提供了丰富的Python SDK来对Azure进行开发管理,包括使用Azure的开源框架在Azure上创建web应用程序,对Azure的虚拟机,存储等进行管理,本系类会简单介绍如何在ASM和 ...
- Sql Server专题一:索引(中)
写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?MS自己不会测试吗?这样的测试 ...
- gdal读写图像分块处理(精华版)
一.gdal进行数据操作在安装好gdal后,即可调用gdal库中的函数.(需要包含的头文件:gdal_priv.h)1.打开数据集使用gdal库进行数据(影像)操作的第一步就是打开一个数据集.对于“数 ...
- Java与C#间json日期格式互转完美解决方案
http://blog.csdn.net/wilsonke/article/details/24362851 作用一种简单方便的数据传输方案,JSON已经成为替代XML的事实标准.然而在JSON中 ...
- wordpress参考网站
wordpress大学http://www.wpdaxue.com/post-tags-and-categories-for-pages.html
- 关于清晰讲解linux正则表达式的博文分享
http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html linux shell 正则表达式(BREs,EREs,PREs)差异比 ...
- POJ3307+找规律
/* 题意:求第N个productivity property数是谁. (productivity property数:就是这个数可以由另外的数的各个位上的乘积得到.) */ #include< ...
- Hibernate问题之'hibernate.dialect' not set
继前文:Hibernate4中buildSessionFactory方法废弃问题.后 继续有问题.本来之前好好的项目,用了这种新的方法后发现问题. 出现 Connection cannot be n ...
- 编程算法 - 最长上升子序列问题 代码(C)
最长上升子序列问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个长为n的数列a. 请求出这个序列中最长上升子序列的长度. 最长上升子序 ...