HOOK(钩子,挂钩)是一种实现Windows平台下类似于中断的机制。HOOK机制允许应用程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能。钩子按使用范围分,可分为线程钩子和系统钩子,其中,系统钩子具有相当大的功能,几乎可以实现对所有Windows消息的拦截、处理和监控。这项技术涉及到两个重要的API,

一个是SetWindowsHookEx,安装钩子;

另一个是UnHookWindowsHookEx,卸载钩子

Windows 有两种钩子,一种是特定线程钩子(Thread specific hooks),一种是全局系统钩子 (Systemwide hooks)。特定线程钩子只是监视指定的线程,而全局系统钩子则可以监视系统中所有的线程。无论是特定线程钩子,还是全局系统 钩子,都是通过 SetWindowsHookEx ()来设置钩子的。对于特定线程钩子,钩子的函数既可以是包含在一个.exe也可以是一个.dll。 但是对于一个全局系统钩子,钩子函数必须包含在独立的 dll中,

编写钩子程序的步骤分为3步:定义钩子函数、安装钩子和卸载钩子。

2.1 定义钩子函数

钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型:

LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)

参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。我们先在钩子函数中实现自定义的功能,然后调用函数 CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下:

LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )

参数 hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。

2.2 安装钩子

在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。其函数原型为:

HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )

参数idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。

#define WH_JOURNALRECORD    0
#define WH_JOURNALPLAYBACK  1    //使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件
#define WH_KEYBOARD         2      //用来监视WM_KEYDOWN 和 WM_KEYUP消息,这些消息通过GetMessage 或者 PeekMessage 函数返回。
#define WH_GETMESSAGE       3    //应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。
#define WH_CALLWNDPROC      4   //使你可以监视发送到窗口过程的消息
#define WH_CBT              5    //在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。

#define WH_SYSMSGFILTER     6
#define WH_MOUSE            7     //监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息

#if defined(_WIN32_WINDOWS)
#define WH_HARDWARE         8
#endif
#define WH_DEBUG            9
#define WH_SHELL           10
#define WH_FOREGROUNDIDLE  11
#if(WINVER >= 0x0400)
#define WH_CALLWNDPROCRET  12
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14

Lpfn是钩子函数的地址。//即回调函数

HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。

dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。

SetWindowsHookEx返回所安装的钩子句柄。

2.3 卸载钩子

当不再使用钩子时,必须及时卸载。简单地调用函数:

BOOL UnhookWindowsHookEx( HHOOK hhk)即可。

通常是把“钩子”做成动态链接库DLL,这样的好处是可以在系统内的每个进程中访问

其实在CWnd::Create函数中也会先调

1.CWnd::Create -> CWnd::CreateEx-> PreCreateWindow ->AfxEndDeferRegisterClass ->AfxRegisterClass 进行窗口类注册

2. CWnd::Create -> CWnd::CreateEx -> AfxHookWindowCreate -> ::SetWindowsHookEx(WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId()); ->CALLBACK _AfxCbtFilterHook -> AfxGetAfxWndProc ->CALLBACK AfxWndProc ->AfxCallWndProc

->WindowProc                  所以可以在cwnd类的虚函数WindowProc 重写实现对应的功能

3.最后调用CreateWindowEx进行真正创建窗口,创建成功后,指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在lParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。简单一句话产生WM_CREATE消息,响应afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

在MFC 单文档或者多文档模式CMainFrame::Create是通过CMainFrame::LoadFrame调用起来的。而LoadFrame是在应用程序类winapp的InitInstance函数被调用。

所以在整个CMainFrame类的执行先后顺序是:LoadFrame -> Create ->PreCreateWindow -> WindowProc -> OnCreate

上面这些函数被执行完后,回到winapp的InitInstance,执行下面的ShowWindow和UpdateWindow。

InitInstance执行完后,回到afxwinmain。执行run,进入消息循环。

HOOK(钩子,挂钩)相关推荐

  1. Wordpress 所有 hook 钩子

    Wordpress 所有 hook 钩子 muplugins_loaded 在必须使用的插件加载之后. registered_taxonomy 对于类别,post_tag 等 Registered_p ...

  2. wince中的hook(钩子)用法

    wince中的hook(钩子)用法 Hook(钩子)是一种在消息到达目标窗口前进行截获的技术.使用钩子主要使用以下三个函数SetWindowsHookEx:创建钩子 CallNextHookEx:将消 ...

  3. Boost:info hook信息挂钩的测试程序

    Boost:info hook信息挂钩的测试程序 实现功能 C++实现代码 实现功能 info hook信息挂钩的测试程序 C++实现代码 #define _CRT_SECURE_NO_DEPRECA ...

  4. mysql 钩子_面试官: 什么是 Hook (钩子) 线程以及应用场景?

    一.Hook 线程介绍 通常情况下,我们可以向应用程序注入一个或多个 Hook (钩子) 线程,这样,在程序即将退出的时候,也就是 JVM 程序即将退出的时候,Hook 线程就会被启动执行. 先看一段 ...

  5. python api框架 hook_python学习之hook钩子的原理和使用

    什么是钩子 之前有转一篇关于回调函数的文章 钩子函数.注册函数.回调函数,他们的概念其实是一样的. 钩子函数,顾名思义,就是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上. 1. hook函 ...

  6. git hook分支_Git hook(钩子文件)机制

    githooks(5) NAME githooks - Hooks(钩子) used by git SYNOPSIS $GIT_DIR/hooks/* 简介 Hooks(钩子),是一些存放于$GIT_ ...

  7. mfc中嵌入python_Python 中的 Hook 钩子函数

    1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是 ...

  8. Inline Hook 钩子编写技巧

    Hook 技术通常被称为钩子技术,Hook技术是Windows系统用于替代中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控制权,在执行系统调用之前执行自身程序, ...

  9. Helm Hook钩子详述

    Hooks Helm提供了Hook的机制,允许Chart开发人员在Release的生命周期中的某些节点来进行干预,比如我们可以利用Hooks来做下面的这些事情: 在加载Chart的其它资源之前,先加载 ...

  10. pytest合集(10)— Hook钩子函数

    一.钩子函数 钩子函数这个称呼是很多开发语言中都会涉及到的一个东西. 1.理解钩子函数 如何理解钩子函数 - 知乎 2.pytest的钩子函数 Hooks钩子函数是pytest框架预留的函数,通过这些 ...

最新文章

  1. python编译安装pyaudio
  2. 14.并发与异步 - 2.任务Task -《果壳中的c#》
  3. 【最新合集】编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞
  4. C#实现局域网UDP广播--
  5. Java设计模式笔记(3)抽象工厂模式
  6. 基础的shell编程问题(二)
  7. 嵌入式常见笔试题总结
  8. LeetCode 781. 森林中的兔子(哈希+贪心)
  9. python界面编程pdf_Python Qt GUI快速编程——PyQt编程指南 中文pdf完整版[99MB]
  10. cs文件,外部类操作窗体控件
  11. 【代码笔记】iOS-获得现在的周的日期
  12. 模板 · ISAP网络流+GAP优化+弧优化
  13. linux grub内核选择,UBUNTU GRUB没有内核选项,怎么回事啊?
  14. idea快速生成SpringBoot项目无法启动问题
  15. 好用的源码行数统计工具——cloc
  16. Vue图片放大镜插件
  17. 【百家讲坛】郦波副教授解读《曾国…
  18. poj2142 The Balance
  19. 资讯类App主流框架(一)
  20. 给出一个不多于五位的正整数,求出它是几位数

热门文章

  1. 如何通过手机访问本地编写的html页面
  2. 绝不在构造/析构函数中使用虚函数
  3. 膝盖中了一箭之康复篇-第九个月暨3月份目标总结
  4. 安装centos 6.5
  5. ibatis.net:尽可能的使用匿名类型替换 Hashtable
  6. 数据库系统的并发控制的两种实现模型
  7. windows下kangle虚拟主机-easypanel跑iis6.0开php空间并支持ZendOptimizer教程
  8. Java跨语言调用实现方案
  9. Node rabbitmq 入门就够了
  10. 平安性格测试题及答案_中国平安EPASS测试题2016年