之前有一次吃饭的时候,听前辈聊到猜想某某输入法的钩子,导致了我们软件crash了,问用户是不是用的某某输入法。当时就比较好奇钩子是啥。

一百度,也能发现网上有非常多的资料可以参考,阅读了一些资料,这里就用比较新手的语言去描述钩子,在系统的消息队列之前拦截消息,对消息进行修改或者拦截,或者原封不动,传递下去。当然,更好的教科书式学习是参考《Windows核心编程》的第22章《DLL注入和API拦截》。参考网上获得的鼠标钩子的源代码,解析和学习一下做一个简单的鼠标钩子的流程和步骤,以及涉及到的知识。

(1)

首先,新建DLL模块,在DLL中声明几个全局变量,并且放入共享的数据段中,如下:

//
// 共享代码段,所有线程共享
//
#pragma data_seg("SHARED")
static HHOOK hhkMouse = NULL;                     // 鼠标钩子句柄
static HINSTANCE g_hInstance = NULL;                      // 本DLL的实例句柄
static HWND g_hWnd = NULL;                // 调用DLL的主窗口句柄,这样就可以SendMessage给主窗口鼠标消息及其参数
#pragma data_seg()
#pragma comment(linker,"/section:SHARED,rws")

延伸问题一: 那几个变量为什么要放入共享段呢?放进去共享段的实际意义是啥呢?

首先,通过我个人的测试而言,这几个变量作为DLL中的全局变量也是不影响使用的。

1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。

2,共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3. 字母RWS表示段具有读、写和共享属性

在DLL中定义低级鼠标处理函数,就是预先处理对应消息的“拦截函数”,如下:

//
// 定义低级鼠标钩子函数
//
LRESULT CALLBACK LowLevelMouseProc(int nCode,           // hook code WPARAM wParam,     // message identifierLPARAM lParam      // mouse coordinates)
{// 有鼠标消息时,将其发给主程序if ( g_hWnd != NULL && nCode == HC_ACTION){::SendMessage(g_hWnd,WM_HOOKMSG,wParam,lParam);}return CallNextHookEx(hhkMouse,nCode,wParam,lParam);}

延伸问题二: 什么叫低级?那高级是怎么样的?

在DLL中,定义安装钩子函数和卸载钩子函数:

//
// 安装低级鼠标子函数,从而截获系统所有的鼠标消息
//
BOOL WINAPI StartHookMouse(HWND hwnd)
{g_hWnd = hwnd;hhkMouse = SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,g_hInstance,0);if ( NULL == hhkMouse){return FALSE;}else{return TRUE;}}//
// 卸载低级鼠标钩子
//
VOID WINAPI StopHookMouse()
{if (hhkMouse != NULL){::UnhookWindowsHookEx(hhkMouse);}
}

延伸问题三: 为什么我们安装钩子要在DLL的函数中进行呢,可不可以在主程序中安装钩子(虽然DLL起码可以把“拦截函数”封装起来)

全局钩子必须安装在DLL中,局部的钩子可以写在主程序中。消息队列是以线程为基础的.一个局部HOOK勾挂的是一个进程内所有线程的消息。此类实现由于不涉及进程CONTEXT切换,是轻量级的HOOK。全局的HOOK会映射到所有加载USER32.DLL的进程中,其实是USER32.DLL为这些进程调用LOADLIBRARY来加载HOOK所在的DLL,并且在所有的消息在被送到消息处理前先调用HOOKPROC。

全局的钩子对系统所有进程有效,当某个进程触发钩子事件时,就会从钩子链中依次执行对应的钩子函数,如果钩子链中某个全局钩子没有出现在进程空间,就会加载对应的钩子Dll(loadlibrary)。这个全局钩子的dll是会被所有能钩触发进程给加载的,如果是exe,显然不能实现

接下来注意的一个问题,我们使用的是def文件,它用来定义DLL中导出的函数,比如,def文件中定义导出的函数:

; hookDll.def : 声明 DLL 的模块参数。LIBRARY   "MouseHook"EXPORTS; 此处可以是显式导出
StartHookMouse
StopHookMouse

(2)

MFC中的小窗口实现主程序,与Hook的技术无关,只要实现按钮和消息即可。

(3)

DLL与主程序进行通信,主要是通过在DLL中和主程序中,自定义消息,DLL的“拦截函数”将拦截到的鼠标信息发送给主程序,从而可以让主程序打印出对应的鼠标消息

延伸问题四: 为什么要进行通信呢?

通信是为了让DLL的“拦截函数”把捕获到的鼠标信息发送给调用窗口,使得调用窗口显示出鼠标消息展示给我们看。

效果大致如图所示:

Hook入门之鼠标钩子相关推荐

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

    用Delphi实现Windows的鼠标钩子函数 Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助 文件中,对Windows API函数的说明沿袭了 V ...

  2. 使用钩子函数[3] - 建立一个全局的鼠标钩子

    分两步: 一.建立 DLL, 并在 DLL 实现钩子的设置.释放和钩子函数; 二.再建一个工程调用测试. 第一步: 做 DLL 先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了): libr ...

  3. [转]VSTO Office二次开发应用程序键盘鼠标钩子

    可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...

  4. VSTO Office二次开发键盘鼠标钩子使用整理

    VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...

  5. VSTO Office二次开发应用程序键盘鼠标钩子

    可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...

  6. 游戏修改器制作教程二:键盘鼠标钩子

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  7. 小小黑客从鼠标钩子开始,密码看看看

    引论 什么是黑客,不同于骇客,黑客一词来源于"Hacker",意思是劈,斩,对于黑客来说学会入侵和破解是提升自己和学习的过程,最重要的是编程能力,因为依赖大多数工具是体现不出自己水 ...

  8. 低级鼠标钩子WH_MOUSE_LL

    翻MSDN可知,鼠标钩子类型有两个,一个是WH_MOUSE,另一个是WH_MOUSE_LL, 至于它们的区别,百度了一下: 1.WH_MOUSE只能监控钩子所在模块的鼠标事件. 2.WH_MOUSE_ ...

  9. Revit API Hook 之 拦截鼠标双击元素事件

    阅读本文章前应具有一定编程基础和 Window API 相关知识 第一步,先封装HookBase抽象类,因所有Hook的都具有注册.卸载逻辑,且注册.卸载大同小易.如下: public abstrac ...

  10. java vk减号_[原]在全局鼠标钩子中模拟鼠标右键单击

    //bSwap:BOOL型 //为TRUE为切换左右键功能,为FALSE为恢复原左右键功能 ::SwapMouseButton(bSwap); 可以使用RegisterHotKey()注册一个热键,在 ...

最新文章

  1. 日志服务接入方式之Unity 3D篇
  2. [翻译:更新]Understanding Linux Network Internals - Table of Contents
  3. spss process插件_SPSS教程:绘制调节效应图
  4. 【技术解决方案】Windows平台下摄像头采集方案
  5. Vue实践--v-model实现简易计算器
  6. 品质创新,江铃控股携手华天软件CAPP系统决战SUV中高端市场
  7. python中计算DataFrame,Series的数据频率
  8. ThinkPHP5捕获致命错误流程
  9. 雷达通信术语中英文对照
  10. pycharm下载安装 pytorch
  11. MAMP配置虚拟主机
  12. MySQL 从 8.0.31 开始从原来的 mysql:mysql-connector-java 改为 com.mysql:mysql-connector-j
  13. 第3章 远程连接管理Linux实践
  14. 价值百万的企业大数据分析报告是如何炼成的?
  15. 基于MATLAB的计算机视觉与深度学习实战
  16. 计算机网络实验路由器,计算机网络路由器配置实验.doc
  17. win10应用商店闪退、打不开解决办法
  18. 用计算机处理信息图文,浅谈计算机技术在报纸图文信息处理中的应用
  19. 叶梓老师 数据分析与数据挖掘-培训提纲
  20. 拯救屏幕接口腐蚀严重的苹果A1989,不换屏给客户省了1K多

热门文章

  1. 用latex生成pdf文件后,文本复制粘贴显示乱码
  2. Gaussview保存文件时,对话框一直弹不出来的原因
  3. 2021年认证杯-数学建模
  4. 【经验总结—2】:深度学习数据集下载网站总结
  5. Matlab 轴承信号仿真+分析
  6. NC文件数据提取完成(1.16)
  7. PID控制算法的C语言实现
  8. php商品详情页页面代码,商品详情页是怎么生成的?
  9. Mac环境下反编译Apk(入门)
  10. adb 驱动安装说明文档