其中涉及到的一些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. python核心编程-第四章-习题

    1.身份.类型.值.其中,身份是每个对象的标识,与内存地址密切相关,可用id()返回:类型决定了对象可以保存什么类型的值,用type()函数.isinstance()函数可以得到对象的类型:值就是对象 ...

  2. java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream(转)

    java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream 使用Tomcat的Manag ...

  3. 如何设置 Internal 类,方法,属性对其他项目可见

    internal 修饰符时程序集内部其他类可见.但对程序集外的类不可见,这样就很好的封装了可见性. 但是,我们也许会碰到类似的情况,特别是基于已有代码开发新的代码时,你会发现很多 internal 的 ...

  4. filestream streamreader

    filestream是一个读取文件的stream,其本身也是支持read和write的,负责的对文件的读与写,而streamreader则是建立在对流的基础上的读,同时还有streamwrite ht ...

  5. QWidget 键盘事件 焦点(源代码级别研究)

    在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件. 键盘事件派发给谁? 如 ...

  6. js 中的switch

    前言 switch 这种表达式在很多语言中都有,比如java, C等待, 使用switch比使用if else 来得方便,来得清晰. 使用语法很简单: switch(n) { case 1: 执行代码 ...

  7. 命令行解释器(shell)

    unix> ./hello hello world unix> ll 显示当前目录下文件信息. shell为命令行解释器,第一个单词可以是内置的外壳命令,也可以是一个可执行文件名.

  8. Z.Studio高级成衣定制(双井店)价格,地址(图)-北京-大众点评网

    Z.Studio高级成衣定制(双井店)价格,地址(图)-北京-大众点评网 Z.Studio高级成衣定制(双井店)

  9. ubuntu 下添加sublime text 启动图标

    ubuntu下无快捷方式一说,如果想快速打开sublime Text,可以创建sublime text 启动图标 1. 创建空白文档 sublime.desktop,注意权限 $ vi /usr/sh ...

  10. hadoop结构出现后format变态

    14/07/10 18:50:47 FATAL conf.Configuration: error parsing conf file: com.sun.org                     ...