首页 > 其他分享 >钩子详解

钩子详解

时间:2023-05-13 15:14:31浏览次数:36  
标签:函数 钩子 SetWindowsHookEx 详解 参数 句柄 线程

钩子函数虽然不多, 但其参数复杂, 应该从参数入手才能深入进去.

UnhookWindowsHookEx 只需要 SetWindowsHookEx 返回的钩子句柄作参数, 这个简单;

先看看 SetWindowsHookEx 的声明:

SetWindowsHookEx(
  idHook: Integer;   {钩子类型}
  lpfn: TFNHookProc; {函数指针}
  hmod: HINST;       {包含钩子函数的模块(EXE、DLL)的句柄}
  dwThreadId: DWORD  {关联的线程}
): HHOOK;
第一个参数非常麻烦, 从后面说:

参数四 dwThreadId : 在设置全局钩子时这个参数一般是 0, 表示关联所有线程; 本例是线程级的钩子, 所以是
GetCurrentThreadId.

参数三 hmod: 是模块实例的句柄, 在 EXE 和 DLL 中都可以用 HInstance 得到当前实例的句柄; 直接用 API 也可以:
GetModuleHandle(nil).

参数二 lpfn: 是钩子函数的指针, 用 @ 和 Addr 函数都可以得到函数指针; 这里的关键是那个钩子函数:
首先不同的钩子类型对应着不同的钩子函数结构, Win32 共有 14 种钩子类型, 这是 详细注释;
本例用的是键盘钩子, 键盘钩子的回调函数的参数结构在 这里, 我们定义的函数名无所谓, 参数必须按照Windows的规定来.
还有, 这个回调函数的调用惯例必须是: stdcall; 我们在上例中是先在接口区声明, 如果不要声明直接实现, 也不能忘了这个 stdcall.

根据以上说明, 做如下修改:
SetWindowsHookEx 的参数有变通;
并且取消了钩子函数在接口区的声明, 是直接实现的;
取消了拦截条件, 现在只要是键盘消息全都拦截.

标签:函数,钩子,SetWindowsHookEx,详解,参数,句柄,线程
From: https://www.cnblogs.com/lucken2000/p/17397423.html

相关文章

  • 建立一个全局的鼠标钩子
    分两步:一、建立DLL,并在DLL实现钩子的设置、释放和钩子函数;二、再建一个工程调用测试.第一步:做DLL先建立一个DLL工程,自动初始的代码如下(去掉注释了):libraryProject1;uses SysUtils, Classes;{$R*.res}beginend.//把工程保存为MyHook.dpr,并实......
  • SetWindowsHookEx - 设置钩子
    提示:如果要设置系统级钩子,钩子函数必须在DLL中.SetWindowsHookEx( idHook:Integer; {钩子类型} lpfn:TFNHookProc;{函数指针} hmod:HINST;   {包含钩子函数的模块(EXE、DLL)句柄;一般是HInstance;如果是当前线程这里可以是0} dwThreadId:DW......
  • MongoDB 功能详解之时间序列集合(Time Series Collections)
    MongoDB功能详解之时间序列集合(TimeSeriesCollections)      时间序列集合(TimeSeriesCollections):MongoDB5.0版本中的新功能。时间序列数据是一系列数据点,通过分析这些随时间变化的数据点而获得对数据的深刻理解。时间序列数据通常由以下组成部分组成:时间:数......
  • ResultMap详解
    前言MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaB......
  • Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)(转载)
    位运算符号概览符号描述运算规则&与两个位都为1时,结果才为1|或两个位都为0时,结果才为0^异或两个位相同为0,不同为1~取反所有位置0变1,1变0<<左移各二进位全部左移若干位,高位丢弃,低位补0>>带符号右移各二进位全部右移若干位,低位丢弃,高位补为符......
  • 详解缓存更新策略及如何选择
    概述缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。为了实现缓存更新,我们可以采用以下四种方式其中的一种:CacheAside策略:应用程序直接与数据库和缓存交互,并负责......
  • K8S 常用资源 YAML 详解
    Pod资源对象yaml详解apiVersion:v1#必选,版本号,例如v1kind:Pod#必选,指定创建资源的角色/类型metadata:#必选,资源的元数据/属性name:string#必选,资源的名字,在同一个namespace中必须唯一namespace:string#必选,Pod所属的命名空间......
  • 云原生第三周--kubernetes组件详解
    etcd组件etcd简介:etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免......
  • 详解集群级备份恢复:物理细粒度备份恢复
    摘要:在实际使用过程中,数据库集群级的故障并非高概率事件,如何安全高效地帮助客户备份恢复一部分数据库元素,才是更加实际的需求,这也是细粒度备份恢复的意义所在。本文分享自华为云社区《GaussDB(DWS)之物理细粒度备份恢复》,作者:我的橘子呢。1. 认识物理细粒度备份恢复相对于集群......
  • 详解集群级备份恢复:物理细粒度备份恢复
    摘要:在实际使用过程中,数据库集群级的故障并非高概率事件,如何安全高效地帮助客户备份恢复一部分数据库元素,才是更加实际的需求,这也是细粒度备份恢复的意义所在。本文分享自华为云社区《GaussDB(DWS)之物理细粒度备份恢复》,作者:我的橘子呢。1. 认识物理细粒度备份恢复相对于集群级备......