啥是windows的钩子?钩子故名思议就是在嵌入到正常执行程序的功能。对于windows来说,每个系统和应用程序之间的交互是使用消息机制来进行。比如点击应用程序上面的某个按钮,就是发送了事件给了应用程序。windows钩子的作用就是在事件发送给应用程序之前截获事件,先对事件做处理,然后有两个选择,可以继续抛出事件,也可以消灭时间。于是每个事件在windows上的相应都是一个事件处理链,没增加一个处理的应用程序就是给这个事件处理链增加一个链接点而已。

创建钩子

创建windows钩子就需要三个步骤:

1 创建钩子

2 相应钩子接收的事件

3 卸载钩子

window提供了钩子的几个接口:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx

其中最需要关注的是几个:

SetWindowsHookEx

UnhookWindowsHookEx

CallNextHookEx

分别是安装钩子,卸载钩子,执行下个钩子操作。执行的顺序如其名:先安装钩子,后处理事件,后调用下个钩子,最后卸载钩子。

一个个看着三个接口:

SetWindowsHookEx

1
2
3
4
5
6
7
8
9
10
11
HHOOK WINAPI SetWindowsHookEx(
  _In_  int idHook,
  _In_  HOOKPROC lpfn,
  _In_  HINSTANCE hMod,
  _In_  DWORD dwThreadId
);

返回值是个HHOOK,就是钩子的唯一标识,类型在c#中是个int型,如果安装钩子成功,返回一个int,如果安装不成功,返回NULL。

参数:

idHook

idHook是个int类型,标识的是钩子的类型,比如7代表钩子监控鼠标事件,2代表键盘事件。这里不同的事件代表捕获不同的消息,所以后面的消息处理事件也会有不同(这里说的不同不是事件的参数个数和类型不同,而是参数值的含义不同)。好了,这里有个问题,如果我要监控所有事件有办法吗?有,你可以使用4(WH_CALLWNDPROC)来捕获所有消息。

lpfn

lpfn是个注册回调事件,c#中可以使用delegate,这个事件大致是如下的接口:

1
2
3
4
5
6
7
8
9
LRESULT CALLBACK CallWndProc(
  _In_  int nCode,
  _In_  WPARAM wParam,
  _In_  LPARAM lParam
);

即有三个参数和一个返回值

nCode:说明下事件如何处理消息,一般如果nCode是小于0的,那么就说明这个注册事件不能做任何处理,应该把事件传递给下个钩子。为0或者其他值根据idHook有不同的含义。

wParam:一般说明这个事件消息的类型。

lParam:一般是指向一个包含具体事件的结构。

hMod

hMod是个int类型,如果钩子的注册事件是由dll包含的话,值非零,如果是由当前进程包含的话,则设置为Intptr.Zero(NULL)

dwThreadId

dwThreadId也是说明这个钩子注册的回调事件的位置,如果是0的话,则注册的回调事件是在当前线程的。如果不是在当前的线程,则dwThreadId是非0

UnhookWindowsHookEx

1
2
3
4
5
BOOL WINAPI UnhookWindowsHookEx(
  _In_  HHOOK hhk
);

理解了SetWindowsHookEx之后,就很好理解UnhookWindowsHookEx了。

这里的HHOOK是SetWindowsHookEx函数的返回值,钩子的唯一标识。

返回的BOOL代表卸载钩子是否成功。

CallNextHookEx

1
2
3
4
5
6
7
8
9
10
11
LRESULT WINAPI CallNextHookEx(
  _In_opt_  HHOOK hhk,
  _In_      int nCode,
  _In_      WPARAM wParam,
  _In_      LPARAM lParam
);

这个函数是用来让事件随着钩子链继续执行下去的。一般在注册的回调事件中执行的,所以和注册的回调事件有点像。

hhk:HHOOK类型(int)代表钩子ID,但是实际上是被忽略的。

nCode,wParam,lParam具体的含义和注册回调函数是一样的。在使用的时候,只要将注册回调函数接受到的参数直接传递给CallNextHookEx就可以了。

windows钩子有什么作用?

借用msdn(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx)上说的几个用途:

1 调试使用(可以监视传递给应用的消息)

2 作为宏使用。(你可以将你在windows的任何动作录制成宏)

3 监控F1动作来提供帮助。(很多应用上F1动作都是调出帮助信息的)

4 模拟键盘和鼠标操作

5 实现基于机器学习的应用(CBT computer-based training )

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2013/05/13/3075179.html,如需转载请自行联系原作者

Windows Hook相关推荐

  1. Windows Hook机制(转贴一)

          最近想写个监视系统的小软件,需要Windows Hook的知识,所以会陆续贴几个关于Hook的文章做参考.       本文将试图以下面的顺序讲解HOOK的大部分内容: 1. WINDOW ...

  2. 模拟键盘、鼠标操作或Windows hook 在部分软件失效的问题

    用户界面权限隔离(UIPI) 在Windows中的权限系统 除了在进程之间提供内核对象的访问保护,窗口系统还利用完整性级别来拒绝低完整性级别的进程访问/更新高完整性级别的进程的用户界面.这个机制称为用 ...

  3. Windows Hook(2)调用DLL函数

    DLL代码 #include <Windows.h>BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVO ...

  4. Windows Hook(1)加载DLL

    DLL代码 #include <Windows.h> BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPV ...

  5. Hook技术之消息拦截(Windows Hook )

    首先来说说windows 消息Hook,这个消息Hook就是我们常用的通过SetWindowsHookEx来设置一个Hook,这个函数通过将这个Hook插入到Hook链的最前端,而发送给我们已经Hoo ...

  6. Windows Hook 易核心编程勾子基本理念

    前言 以前我非常沉迷入黑客,每每看着高手们发到网上的攻击检测程序心中那个羡慕啊,要是那天我也能写出这样的程序该多好啊可是,我也就只有羡慕的份,谁叫自己不懂英语呢,又没有中文的编程语言直到有一天,我在一 ...

  7. Windows Hook 易语言核心编程勾子基本理念

    前言    以前我非常沉迷入黑客,每每看着高手们发到网上的攻击检测程序 心中那个羡慕啊,要是那天我也能写出这样的程序该多好啊 可是,我也就只有羡慕的份,谁叫自己不懂英语呢,又没有中文的编程语言 直到有 ...

  8. C++ Windows Hook 消息钩子 详解

    本文完整测试工程的源码免积分下载地址:http://download.csdn.net/detail/zy_dreamer/5336484 我们先来简单的了解一下基本概念: Hook是WINDOWS提 ...

  9. Windows HOOK 按键工具类

    前段时间学习windows 的 HOOK 操作, 编写按键信息打印工具, 于是想着写一个工具类拦截按键并相应自定义的操作, 于是编写了下面这个 按键 HOOK 工具类. 实现的思路就是安装一个全局的按 ...

最新文章

  1. java 中启动线程的正确方式
  2. php-fpm的pool,php-fpm慢执行日志,open_basedir,php-fpm进程管理
  3. C/C++代码优化方法
  4. Element ui tree树形控件获取当前节点id和父节点id
  5. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
  6. 什么是document对象?如何获取文档对象上的元素?_JavaScript DOM操作元素的方法,你还记得多少?...
  7. 深入浅出通信原理丨边缘计算阅读周
  8. 华为手机html文件是什么,如何备份华为手机文件
  9. 怎么把office卸载干净?
  10. Slurm的前处理prolog和后处理epilog
  11. loj10099 点双连通分量
  12. 回忆我的过去一年2020年考研以及研究生规划
  13. 记:解决 Weditor 页面元素坐标定位不到、不准确的问题
  14. 结巴分词python安装_“结巴”分词:做最好的Python分词组件
  15. GOTC 2023全球开源技术峰会
  16. “知识分享与交流”活动有感
  17. c语言如何将数组里的数排序输出,c程序输入10个数到一维数组中,按升序排序后输出。...
  18. TBR架构的一些理解
  19. [已解决]为什么使用远程桌面无法打开雷电模拟器,OpenGL版本始终1.1.0?
  20. 从“数字孪生”看三维扫描技术应用

热门文章

  1. 识别人声_演唱人声的5个技巧
  2. IDEA svn 菜单不见了,解决方法
  3. 怎么解决input中readonly属性的iOS一直存在光标问题
  4. Objective-C中的@property
  5. 使用log4Net 输出日志到mongodb
  6. 断电后supervisor启动时报错
  7. android 电源管理 wakelock 唤醒锁机制
  8. Java Attach API
  9. tcp有限状态机分析
  10. Ruby如何成长成高性能系统构架