Windows Hook

啥是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,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP协议之Expect爬坑

前言今天,在对接一个第三方平台开放接口时遇到一个很棘手的问题,根据接口文档组装好报文,使用HttpClient发起POST请求时一直超时,对方服务器一直不给任何响应。发起请求的代码如下:using (var httpClient new HttpCli…

【ArcGIS微课1000例】0028:ArcGIS根据属性快速分割生成多个shp文件

ArcGIS10.5及以上的版本提供了按属性分割工具,(分析工具->提取->按属性分割)工具。也可以使用10.2版本的分割工具,效果应该是一样的。本文演示使用分割工具批量快速提取一个县范围内的多个镇,生成多个镇矢量shp数据。 扩展阅读:【ArcGIS遇上Python】ArcGIS Python按…

Win11 恢复 Win10经典右键菜单 亲测有效

管理员运行命令: reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重…

把一个字符串里符合表情文字标签的地方全部替换为相应的图片的方法

1、表情数据: var emotion [{"name": "Expression_1","text": "[微笑]"},{"name": "Expression_2","text": "[撇嘴]"},{"name": "Expression_3","text&…

【ArcGIS微课1000例】0029:ArcGIS绘制平行线(构造平行公路)

在实际工作中,有时需要绘制平行线,比如道路两边的边界线,可以使用“平行复制”功能快速绘制平行线,本文介绍如何使用“平行复制”功能快速绘制平行线。 1. 加载公路矢量 加载配套实验数据包中的数据0029.rar中的矢量数据:公路。 2. 生成平行公路 点击“编辑器”→“开始…

2017年初随想——几个小目标

回顾往事很惨,展望未来渺茫 2016年不顺的事情一箩筐,母亲追求信仰(误入歧途)导致父母离婚,父亲又遭遇车祸,现在依然瘫痪在床,意识都尚未清醒,母亲却依然杳无音信。而我则刚工作2年半…

Win11 没有磁盘清理工具,如何清理磁盘旧的windows.old文件

win11 磁盘右键没有了“磁盘清理工具” 如果想清理文件,可以打开设置(WinI)系统—存储—清理建议 您也可以打开“存储感知”,系统会在需要时帮你自动清理文件。

脚本进阶,函数调用实例练习

一、练习:脚本:判定192.168.0.200-192.168.0.254之间哪些主机在线,要求:1、使用函数来实现一台主机的判定过程:2、在主程序中调用此函数判定指定范围内的所有主机的在线情况,vim ping.sh#!/bin/bash#PING()…

.NET开发云原生应用,你只差给自己加个油

为什么要云原生(Cloud Native)Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹…

java成员变量的初始化

2019独角兽企业重金招聘Python工程师标准>>> 类变量(static变量,不需要实例化对象也可以引用) 实例变量(非static变量,需要实例化对象) 局部变量(类的成员函数中的变量) 初始化方式: 构造函数初始化 变量声明时初始化 代码块初始化 java自动初始化(在构造函数执行之…

Win11 的日历 替代

Win11 的日历虽然漂亮,却少了很多小功能,特别是没有秒钟和日程的设计,让用惯了 Win10 的小伙伴大呼不满。原来曾经用过360带的日历,可惜不支持Win11,下面这个日历是一款功能强大、颜值很高的小工具,能够提供…

ReactNative--React简介

React 基础框架,是一些实现理念,不能用来做网页的开发和手机应用的开发 React.js 用来做网页开发 ReactNative 移动应用开发 在学习ReactNative之前,先学习React http://reactnative.cn/ 中文网 http://facebook.github.io/react-nativ…

【ArcGIS微课1000例】0030:ArcGIS利用MXD doctor工具分析并修复mxd地图文档

MXD Doctor 是一个独立的应用程序,位于 ArcGIS Desktop 安装目录下的 Tools 文件夹中。该工具可用于分析已损坏的 .mxd 文件。根据分析结果,可将已损坏的 .mxd 文件中所包含的实体复制到新的或现有 .mxd 文件中。 可以从所有程序 > ArcGIS > Desktop 工具中打开 MXD Do…

分析一个 .NET 写的 某 RFID标签系统 CPU暴涨

一:背景 1. 讲故事前段时间有位朋友说他的程序 CPU 出现了暴涨现象,由于程序是买来的,所以问题就比较棘手了,那既然找到我,就想办法帮朋友找出来吧,分析下来,问题比较经典,有必要和大…

linux开机引导过程总览

简单的说,系统的启动过程如下: 1.开机自检: 按下电源按键后,计算机硬件会主动读取BIOS加载硬件信息并进行硬件的自我测试,然后系统会根据BIOS里的启动顺序读取第一个可启动的设备,从而移交系统控制权&#…

CentOS关机与重启命令详解

2019独角兽企业重金招聘Python工程师标准>>> Linux centos重启命令: 1、reboot  2、shutdown -r now 立刻重启(root用户使用)  3、shutdown -r 10 过10分钟自动重启(root用户使用)  4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用)如果…

JS正则提取字符串

河北科技师范学院欧美学院新闻标题 河南大学迈阿密学院新闻标题 首都经济贸易大学密云分校新闻标题 北京科技大学(延庆校区)新闻标题 湖北中医药大学职业技术学院新闻标题 公安消防部队高等专科学校新闻标题 从上边的类似新闻标题中提取完整学校名称,最终参考代…

【工具】PC端调试手机端 Html 页面的工具

一、概述 有一个项目需要在手机端显示一个 web 页面,而每次把应用 launch 后,从手机端看比较麻烦,因此搜罗了几种在 PC 端调试手机端页面的工具。 二、工具 http://fonkie.iteye.com/blog/1846858 http://blog.csdn.net/dojotoolkit/article/…

【ArcGIS微课1000例】0031:ArcGIS中的32个拓扑规则(图文详解)

在地理数据库中,拓扑是定义点要素、线要素以及面要素共享重叠几何的方式的排列布置。例如,街道中心线与人口普查区块共享公共几何,相邻的土壤面共享公共边界。学习拓扑就必须掌握ArcGIS中常见的拓扑规则。 文章目录 一、面的拓扑规则(10种)二、点的拓扑规则(6种)三、线的…

Blazor University (38)JavaScript 互操作 —— 从 .NET 调用 JavaScript

原文链接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/从 .NET 调用 JavaScriptJavaScript 应添加到服务器端 Blazor 应用程序的 /Pages/_Host.cshtml 或 Web Assembly Blazor 应用程序的 wwwroot/index.html 中。然后可以通…