作用:将应用程序定义的钩子过程安装到钩子链中。您将安装一个挂钩程序来监视系统的某些类型的事件。这些事件与特定线程或与调用线程在同一桌面中的所有线程相关联。

HHOOK WINAPI SetWindowsHookEx(_In_  int        idHook,_In_ HOOKPROC lpfn,_In_ HINSTANCE hMod,_In_ DWORD dwThreadId
);

参数说明:

dHook [in]
类型:int
要安装的挂钩程序的类型。此参数可以是以下值之一。

含义
WH_CALLWNDPROC4

在系统将其发送到目标窗口过程之前,安装一个监视消息的挂接过程。有关更多信息,请参阅CallWndProc挂钩过程。

WH_CALLWNDPROCRET12

安装一个挂钩过程,用于在目标窗口过程处理消息后监视消息。有关更多信息,请参阅CallWndRetProc挂钩过程。

WH_CBT

安装钩子程序,接收对CBT应用程序有用的通知。有关更多信息,请参阅CBTProc钩子过程。

WH_DEBUG9

安装一个挂钩程序,用于调试其他钩子程序。有关更多信息,请参阅DebugProc挂钩过程。

WH_FOREGROUNDIDLE11

安装挂钩过程,当应用程序的前台线程即将变为空闲时,该过程将被调用。此挂接对于在空闲时间内执行低优先级任务很有用。有关更多信息,请参阅ForegroundIdleProc挂钩过程。

WH_GETMESSAGE3

安装挂钩过程,监视发送到消息队列的消息。有关更多信息,请参阅GetMsgProc钩子过程。

WH_JOURNALPLAYBACK1

安装一个挂钩过程,用于发送先前由WH_JOURNALRECORD挂钩过程记录的消息。有关更多信息,请参阅JournalPlaybackProc挂钩过程。

WH_JOURNALRECORD0

安装挂钩过程,记录发布到系统消息队列的输入消息。这个钩子对于记录宏很有用。有关更多信息,请参阅JournalRecordProc挂钩过程。

WH_KEYBOARD2

安装一个监视按键消息的挂钩过程。有关详细信息,请参阅KeyboardProc挂钩过程。

WH_KEYBOARD_LL13

安装一个挂钩程序来监控低级别的键盘输入事件。有关更多信息,请参阅LowLevelKeyboardProc钩子过程。

WH_MOUSE7

安装一个监视鼠标消息的挂钩过程。有关更多信息,请参阅MouseProc挂钩过程。

WH_MOUSE_LL14

安装一个挂钩程序来监控低级别的鼠标输入事件。有关更多信息,请参阅LowLevelMouseProc钩子过程。

WH_MSGFILTER-1

安装一个挂钩过程,用于监视在对话框,消息框,菜单或滚动条中由于输入事件而生成的消息。有关更多信息,请参阅MessageProc挂钩过程。

WH_SHELL10

安装一个钩子过程,接收对shell应用程序有用的通知。有关详细信息,请参阅ShellProc钩子过程。

WH_SYSMSGFILTER6

安装一个挂钩过程,用于监视在对话框,消息框,菜单或滚动条中由于输入事件而生成的消息。挂钩过程监视与调用线程相同的桌面中的所有应用程序的这些消息。有关更多信息,请参阅SysMsgProc钩子过程。

lpfn [in]
类型:HOOKPROC
指向挂钩过程的指针。如果dwThreadId参数为零或指定由不同进程创建的线程的标识符,则lpfn参数必须指向DLL中的挂接过程。否则,lpfn可以指向与当前进程相关联的代码中的挂钩过程。
hMod [in]
类型:HINSTANCE
包含lpfn参数指向的钩子过程的DLL的句柄。所述HMOD参数必须设置为NULL,如果dwThreadId参数指定由当前进程,并且如果钩子程序是与当前过程相关联的所述代码中创建的线程。
dwThreadId [in]
类型:DWORD
挂钩过程与之关联的线程的标识符。对于桌面应用程序,如果此参数为零,则挂接过程与运行在与调用线程相同的桌面中的所有现有线程相关联。有关Windows Store应用程序,请参阅备注部分。

返回值

类型:HHOOK
如果函数成功,则返回值是挂钩过程的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError。

备注
SetWindowsHookEx可以用于将DLL注入到另一个进程中。32位DLL不能被注入到64位进程中,64位DLL不能被注入到32位进程中。如果应用程序需要在其他进程中使用挂钩,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,64位应用程序调用SetWindowsHookEx来注入64位DLL进入64位进程。32位和64位DLL必须具有不同的名称。
因为钩子在应用程序的上下文中运行,所以它们必须与应用程序的“位置”匹配。如果32位应用程序在64位Windows上安装全局钩子,则将32位钩子注入每个32位进程(通常的安全边界)。在64位进程中,线程仍被标记为“挂钩”。但是,由于32位应用程序必须运行钩子代码,系统会在挂钩应用程序的上下文中执行钩子; 具体来说,在调用SetWindowsHookEx的线程上。这意味着挂钩应用程序必须继续抽取消息,否则可能会阻止64位进程的正常运行。
如果64位应用程序在64位Windows上安装全局钩子,则将64位钩子注入到每个64位进程中,而所有32位进程都对挂钩应用程序使用回调。
要挂起64位Windows安装桌面上的所有应用程序,请安装32位全局钩子和64位全局钩子,每个钩子都从适当的进程中进行,并且一定要在挂钩应用程序中抽取消息以避免阻止正常运行。如果您已经有32位全局挂钩应用程序,并且不需要在每个应用程序的上下文中运行,则可能不需要创建64位版本。
如果hMod参数为NULL并且dwThreadId参数为零或指定由另一进程创建的线程的标识符,则可能会发生错误。
调用CallNextHookEx函数链接到下一个钩子过程是可选的,但强烈建议; 否则,已安装钩子的其他应用程序将不会收到钩子通知,因此可能会出现错误的行为。您应该调用CallNextHookEx,除非您绝对需要防止其他应用程序看到通知。
在终止之前,应用程序必须调用UnhookWindowsHookEx函数来释放与该钩子关联的系统资源。
挂钩的范围取决于挂钩类型。一些挂钩只能用全局范围设置; 其他的也可以只设置一个特定的线程,如下表所示。

范围
WH_CALLWNDPROC 线程或全局
WH_CALLWNDPROCRET 线程或全局
WH_CBT 线程或全局
WH_DEBUG 线程或全局
WH_FOREGROUNDIDLE 线程或全局
WH_GETMESSAGE 线程或全局
WH_JOURNALPLAYBACK 全球唯一
WH_JOURNALRECORD 全球唯一
WH_KEYBOARD 线程或全局
WH_KEYBOARD_LL 全球唯一
WH_MOUSE 线程或全局
WH_MOUSE_LL 全球唯一
WH_MSGFILTER 线程或全局
WH_SHELL 线程或全局
WH_SYSMSGFILTER 全球唯一

对于指定的钩子类型,首先调用线程钩子,然后调用全局钩子。请注意,在安装钩子的线程上,而不是线程处理钩子,可以调用WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL和低级钩子。对于这些钩子,如果一个32位钩子在钩链中的64位钩子的前面,则可能会调用32位和64位钩子。
全局钩子是一个共享资源,安装程序会影响与调用线程相同的桌面中的所有应用程序。所有全局钩子函数都必须在库中。全局钩子应该限于专用应用程序或在应用程序调试期间用作开发帮助。不再需要钩子的库应该删除其挂钩过程。
Windows Store应用程序开发如果dwThreadId为零,则Windows Store应用程序进程和Windows Runtime代理进程的窗口挂钩DLL未被加载,除非它们由UIAccess进程(辅助工具)安装。该通知在安装程序的线程上提供了这些钩子:
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL
这种行为类似于钩子DLL和目标应用程序进程之间的架构不匹配时发生的情况,例如,当钩子DLL为32位,应用程序进程为64位时。

SetWindowsHookEx相关推荐

  1. 进程间通信——自定义消息方式实现(SetWindowsHookEx)

    本文演示如何使用自定义消息来实现进程间通信. 原理:使用SetWindowsHookEx给目标进程添加一段HOOK程序,用来处理自定义消息,然后用SendMessage向目标进程发送自定义消息,从而实 ...

  2. dll注入之SetWindowsHookEx(1)

    文章目录 第一步 实现代码举例: Dll2.dll实现代码 Main.cpp实现代码 插入一个提示(vs如何打开MSDN帮助文档) 第一步 学会写dll(格式这些东西自行查询 以及学习),然后生成(解 ...

  3. (Hook)SetWindowsHookEx和UnhookWindowsHookEx

    文章目录 函数功能 函数声明 第一个参数 第二个参数 第三个参数 第四个参数 返回值 包含机制 钩子链表 钩子子程 安装释放 运行机制 补充说明 补充 代码实现 _tcsrchr 的用法 插入一个提示 ...

  4. SetWinEventHook和SetWindowsHookEx的异同[转]

    SetWinEventHook和SetWindowsHookEx都可以指定钩子函数(hook function)来截取别的进程中的消息,但是他们之间有一些不同. ?SetWindowsHookEx有两 ...

  5. C#使用SetWindowsHookEx时报错“类型的已垃圾回收委托进行了回调”

    报错: "类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们." 解 ...

  6. SetWindowsHookEx 其他进程的 记录

    SetWindowsHookEx(  WH_GETMESSAGE,CallWndProc, HInstance, h2); WH_GETMESSAGE  这个类型 hook  其他窗体的 线程是正常的 ...

  7. 通过SetWindowsHookEx实现跨进程子类化

    这些相关的东西,起源于工作中遇到的一个简单的问题:如何在一个对话框,通过程序,按下另一个对话框(另一个程序)上的当前焦点的按钮. 假设控制的对话框叫DlgA,被控制的对话框叫DlgB. 1.原先的设想 ...

  8. 手把手教你用SetWindowsHookEx做一个键盘记录器

    "无忌,我教你的还记得多少?" "回太师傅,我只记得一大半." "那,现在呢?" "已经剩下一小半了." "那 ...

  9. Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)

    文章目录 Hook(Windows系统机制) Hook定义 Hook原理 系统钩子与线程钩子 钩子函数 设置钩子: SetWindowsHookEx 参数说明: 释放钩子: UnhookWindows ...

最新文章

  1. 显示股票信息页面的开发
  2. 数据远程实时备份容灾方案
  3. 如何利用云原生技术构建现代化应用
  4. 解决:Navicat for mysql 设置外键出错
  5. 纺织人工智能的下一个独角兽——智能验布机
  6. github 中redisPhpAdmin redis 可视化界面
  7. 配置apache密码认证
  8. 【渝粤教育】广东开放大学 移动软件测试 形成性考核 (50)
  9. 再谈本土EDA竞争力顺便聊聊DTCO在中国落地
  10. 向日葵深度linux,完美使用向日葵远程软件
  11. 【使用老电脑win7下载miniconda】
  12. 微信3.1.0.58逆向-微信3.1.0.58HOOK接口说明(WeChatHelper.dll)-获取当前聊天微信ID
  13. 区块链、通证与供应链风险管理适应性分析研究
  14. 计算机管理里怎么改ahci,ahci怎么开启_电脑BIOS修改ahci模式教程 - 系统家园
  15. 希望C语言能够给我铺路
  16. 百度快照劫持怎么解决、百度快照劫持如何排除?百度快照劫持如何修复?
  17. 【解决】开始→运行框中的命令无法记录历史的问题
  18. Vue(三)——过滤器,内置指令,自定义指令,组件
  19. 计算机网络——VRRP(第一条冗余协议)
  20. 树莓派使用cgminer挖矿测试

热门文章

  1. unittest测试框架_python接口自动化测试 - 4.unittest单元测试框架学习
  2. 在家吃饭保平安,华人学者研究发现,经常在外就餐增加死亡风险
  3. 代码分析 | 单细胞转录组clustering详解
  4. 遗传所屠强研究组开发Decode-seq方法显著提高差异表达基因分析的准确性
  5. manga camera android,Manga-Camera
  6. 新建一个同名域能不能替换原域_能不能挣钱,从你最早设计猪场就已经决定了!...
  7. latex textbf没有用_使用LaTeX写作业
  8. python3库黑客_想知道黑客为什么首先Python吗?看看这些渗透测试工具和库
  9. colorpix取色小工具_五款互联网人必备的免费工具,超级实用
  10. date对象 java_Java_按照指定的日期创建 Date对象