其中涉及到的一些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. JS编程最佳实践

    最近花了一周时间把<编写可维护的js> 阅读了一遍, 现将全书提到的JS编程最佳实践总结如下, 已追来者! 1.return 之后不可直接换行, 否则会导致ASI(自动分号插入机制)会在r ...

  2. Apache无法启动解决方案

    Apache无法启动错误原因: 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开 ...

  3. PHP根据身份证号码验证、获取星座、生肖和性别函数

    首先介绍一下身份证含义 新的18位身份证号码各位的含义:1-2位省.自治区.直辖市代码:3-4位地级市.盟.自治州代码:5-6位县.县级市.区代码:7-14位出生年月日,比如19670401代表196 ...

  4. 为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数?

    为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数? MSDN里对这个问题的答案十分的晦涩.不过现在我们已经有了足够的知识来解答这个问题.考虑下面的情况:       ...

  5. IOS设备设计完整指南(转载)

    http://blog.sina.com.cn/s/blog_6cc9af670102vq12.html

  6. This function or variable may be unsafe. Consider using scanf_s instead.

    去掉安全检查,开头加上即可: #define _CRT_SECURE_NO_WARNINGS 或者: 严重性代码 说明项目文件行禁止显示状态 错误C4996 'scanf': This functio ...

  7. 全国计算机等级考试二级教程-C语言程序设计_第2章_C程序设计的初步知识

    正负号与被除数一致. 3 % (-5) == 3 (-3) % 5 == -3 不用求余运算符,求出余数. int x, y; 答:x - x / y * y; const int i = 10; c ...

  8. Oracle表的常用查询实验(一)

    Oracle表的常用查询实验(一) 练习1.请查询表DEPT中所有部门的情况. select * from dept; 练习2.查询表DEPT中的部门号.部门名称两个字段的所有信息. select d ...

  9. barManager.Menu(barSubItem)

    DevExpress 的帮助文档是在太缺乏了,他自己的帮助只有简单描述,没有样例,而它的网站上的在线帮助只有利用它的设计器设计的ToolBar.PopupMenu ,没有利用代码开发的.虽然要利用代码 ...

  10. Linux系统的简介及Linux系统的安装

    一.写在前面  本文仅仅对Linux系统进行简要的概述已经对Linux系统的安装进行简要的介绍 二.完成目标 1.Linux操作系统的基本概念 2.Linux系统的安装 三.基本概念 1.什么是操作系 ...