其中涉及到的一些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. apache AH01630: client denied by server configuration错误解决方法

    今天本来是想要在自己本地搭建一个wamp环境用来做一些代码的测试和框架的学习. 鉴于目前工作的时候用到了php5.5,所以就用了wamp-server V2.5版本,安装完成之后配置虚拟主机一直出现4 ...

  2. 使用委托解决"线程间操作无效: 从不是创建控件“textBox1”的线程访问它" 问题

    在winform编程中常遇到此类问题,造成辅助线程无法给控件赋值 //定义委托 private delegate void SetTextCallback(string text); //在给text ...

  3. KVO的实现原理探寻

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  4. Net Core WebApi单元测试

    单元测试 本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json  ...

  5. ReactNative

    基于ReactNative实现的博客园手机客户端   去年九月,facebook发布了react-native,将web端的javaScript和react技术扩展到了IOS和Android的原生应用 ...

  6. Nginx 配置指令的执行顺序(十一)

    紧跟在 post-access 阶段之后的是 try-files 阶段.这个阶段专门用于实现标准配置指令 try_files 的功能,并不支持 Nginx 模块注册处理程序.由于 try_files  ...

  7. OpenStack high-level Functionsenabled

  8. phpadmin

    一晚上都在调试数据库,都要疯了,整理如下: 0.Apache服务器的443端口与VMware的冲突,所以要更改配置文件.设为440就可以(这个随意). 1.因为要远程访问,默认密码为空,所以首先给ro ...

  9. Web服务器压力测试一例

    近期部门新上线一个服务,我们使用ab和locust分别测试 目前项目属于demo阶段,对访问量的支持不要求太高,我们暂且设定在500请求,20并发 工具介绍 ab ab全称为:Apache HTTP ...

  10. IOS 开展 分别制定了iphone 和 ipad 好? 或开发一个 Universal好?

    最近因为工作的需要,.因为时间短的开发周期 开发的需要 积 至iphone 和 ipad 台 执行 优势的版本号 1.安装包,轻松管理,分布 2.您下载iphone,ipad 会自己主动下载 3.审核 ...