其中涉及到的一些API,网上均能查到详细的解释,这里不再熬述。源码下载

因为是全局钩子,所以要用dll注入。用到的鼠标消息结构如下:

  1. PMouseHookStruct = ^TMouseHookStruct;
  2. {$EXTERNALSYM tagMOUSEHOOKSTRUCT}
  3. tagMOUSEHOOKSTRUCT = packed record
  4. pt: TPoint;
  5. hwnd: HWND;
  6. wHitTestCode: UINT;
  7. dwExtraInfo: DWORD;
  8. end;
  9. TMouseHookStruct = tagMOUSEHOOKSTRUCT;

DLL代码,Mouse_HookDLL

  1. library Mouse_HookDLL;
  2. { Important note about DLL memory management: ShareMem must be the
  3. first unit in your library's USES clause AND your project's (select
  4. Project-View Source) USES clause if your DLL exports any procedures or
  5. functions that pass strings as parameters or function results. This
  6. applies to all strings passed to and from your DLL--even those that
  7. are nested in records and classes. ShareMem is the interface unit to
  8. the BORLNDMM.DLL shared memory manager, which must be deployed along
  9. with your DLL. To avoid using BORLNDMM.DLL, pass string information
  10. using PChar or ShortString parameters. }
  11. uses
  12. SysUtils,
  13. Windows,
  14. Messages,
  15. Classes;
  16. {$R *.res}
  17. var
  18. NextHook : HHook;
  19. //调用者的Handle,用来给其发消息
  20. CallHandle : HWND;
  21. //通知调用者的消息,由调用者传进来
  22. MessageID : Word;
  23. //挂钩子函数 ,这里只处理鼠标移动,其他的鼠标动作,道理一样
  24. function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
  25. begin
  26. Result := 0;
  27. if code < 0 then
  28. Result := CallNextHookEx(NextHook,code,wParam,lParam);
  29. case wParam of
  30. WM_NCMOUSEMOVE,WM_MOUSEMOVE:
  31. begin
  32. //给调用者发消息
  33. SendMessage(CallHandle,MessageID,wParam,Integer(@pMouseHookStruct(lParam)^));
  34. end;
  35. end;
  36. end;
  37. //启动钩子
  38. function StartHook(MsgID:Word):Bool;stdcall;
  39. begin
  40. Result := False;
  41. if NextHook <> 0 then
  42. Exit;
  43. MessageID := MsgID;
  44. //挂钩,SetWindowsHookEx的参数dwThreadId=0,表示挂全局的,不知道为什么,我系统是2003,用WH_MOUSE只能在本进程中实现钩子,WH_MOUSE_LL可以实现全局,在Delphi7中,是没有WH_MOUSE_LL定义的,你可以自己定义,值是14
  45. NextHook := SetWindowsHookEx(WH_MOUSE_LL,@HookProc,HInstance,0);
  46. Result := NextHook <> 0;
  47. end;
  48. //脱钩
  49. function StopHook:Bool;stdcall;
  50. begin
  51. if NextHook <> 0 then
  52. begin
  53. UnHookWindowsHookEx(NextHook);
  54. NextHook := 0;
  55. end;
  56. Result := NextHook = 0;
  57. end;
  58. //传递调用者句柄
  59. procedure SetCallHandle(sender:HWND);stdcall;
  60. begin
  61. CallHandle := sender;
  62. NextHook := 0;
  63. end;
  64. exports
  65. StartHook name 'StartHook',
  66. StopHook name 'StopHook',
  67. SetCallHandle name 'SetCallHandle';
  68. begin
  69. end.

调用者代码,HookTest

  1. unit HookTest;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls;
  6. type
  7. TfrmHookTest = class(TForm)
  8. Label1: TLabel;
  9. procedure FormCreate(Sender: TObject);
  10. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  11. private
  12. { Private declarations }
  13. //重载消息处理
  14. procedure WndProc(var Message: TMessage);override;
  15. public
  16. { Public declarations }
  17. end;
  18. var
  19. frmHookTest: TfrmHookTest;
  20. const
  21. WM_TestMsg = WM_User + 100;
  22. implementation
  23. {$R *.dfm}
  24. function StartHook(MsgID:Word):Bool;stdcall;external 'Mouse_HookDLL.dll';
  25. function StopHook:Bool;stdcall;external 'Mouse_HookDLL.dll';
  26. procedure SetCallHandle(sender:HWND);stdcall;external 'Mouse_HookDLL.dll';
  27. procedure TfrmHookTest.FormClose(Sender: TObject; var Action: TCloseAction);
  28. begin
  29. StopHook;
  30. end;
  31. procedure TfrmHookTest.FormCreate(Sender: TObject);
  32. begin
  33. SetCallHandle(Self.Handle);
  34. if not StartHook(WM_TestMsg) then
  35. begin
  36. ShowMessage('挂钩失败!');
  37. end;
  38. end;
  39. procedure TfrmHookTest.WndProc(var Message: TMessage);
  40. var
  41. x,y:integer;
  42. begin
  43. //得到符合条件的钩子
  44. if Message.Msg = WM_TestMsg then
  45. begin
  46. x := pMouseHookStruct(Message.LParam)^.pt.X;
  47. y := pMouseHookStruct(Message.LParam)^.pt.Y;
  48. //显示x,y坐标
  49. Self.Label1.Caption := '鼠标当前位置:x='+IntToStr(x)+' : y='+IntToStr(y);
  50. end;
  51. inherited;
  52. end;
  53. end.

运行结果

http://blog.csdn.net/bdmh/article/details/5888287

Delphi实现全局鼠标钩子的更多相关文章

  1. 全局鼠标钩子:WH_MOUSE_LL, 在【 win 10 上网本】上因为太卡,运行中丢失全局鼠标钩子

    一台几年前买的上网本,让我安装了一个 win 10,然后用来测试程序的时候, 发现 使用 SetWindowsHookEx(WH_MOUSE_LL, mouseHook, GetModuleHandl ...

  2. 用Delphi实现Windows的鼠标钩子函数

    Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...

  3. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  4. 在C#中使用全局鼠标、键盘Hook

    今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...

  5. 如何在C#中使用全局鼠标、键盘Hook

    今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...

  6. HOOK API (一)——HOOK基础+一个鼠标钩子实例

    HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...

  7. VC6 鼠标钩子 最简单样例

    Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...

  8. C#全局鼠标键盘Hook

    原文出自:http://www.cnblogs.com/iEgrhn/archive/2008/02/17/1071392.html using System; using System.Collec ...

  9. C#键盘钩子 鼠标钩子

    最新对C#模拟键盘按键,鼠标操作产生了兴趣.特从网上收集了一些常用的API用来调用键盘,鼠标操作. class Win32API { #region DLL导入 /// <summary> ...

随机推荐

  1. Train Problem II

    问题陈述: HDOJ Problem - 1023 问题解析: 卡特兰数(Catalan)的应用 基本性质: f(n) = f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2) ...

  2. DTS结构及其编译方法

    一.主要问题1,需要了解dtsi与dts的关系2,dts的结构模型3,dts是如何被编译的,以及编译后会生成一个什么文件. 二.参考文字1,DTS(device tree source).dts文件是 ...

  3. python学习day12

    目录 html结构与标签 css样式   html结构之head <head> 标签用于定义文档的头部,它是所有头部元素的容器.<head> 中的元素可以引用脚本.指示浏览器在 ...

  4. AdminCMD

    program AdminCMD; {$APPTYPE CONSOLE} uses Windows, ShellApi, SysUtils; function RunAsAdmin(const iEx ...

  5. ActiveX异步回调JavaScript

    ActiveX异步回调JavaScript 开发环境:VC6.0. 背景知识:COM/ActiveX/JavaScript/MFC/Thread 想必用过Ajax的童鞋们都知道xmlhttp这个东西吧 ...

  6. poj 1887 Testing the CATCHER_最长上升子序列

    题意:题目太长没看,直接看输入输出猜出是最长下降子序列 用了以前的代码直接a了,做法类似贪心,把最小的顺序数存在数组里面,每次二分更新数组得出最长上升子序列 #include<iostream& ...

  7. 数据结构:最小生成树--Prim算法

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  8. R-plot

    颜色.图例和线 在散点图中添加信息.图例以及回归线. 模拟数据 #模拟数据 dat <- data.frame(X = runif(100,-2,2),T1 = gl(n=4,k=25,labe ...

  9. 工厂类分离与java反射机制

    网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录  加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我             黙 ...

  10. hibernate初体验

    简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...