捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
19 2017.06

SetWindowsHookEx

点击次数:1283 更新时间:2017-6-19 19:51:35  【打印此页

原文链接 -> 传送门

函数功能:

SetWindowsHookEx 函数用于安装应用程序定义的钩子处理程序到钩子链表中。你可以安装钩子处理程序监控系统某些类型事件。这些事件被关联到特定的线程或所有线程在同一桌面的调用线程。


API 函数原型:

注释:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选的。

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


参数解析:
 

参数

含义

idHook

指定被安装的钩子处理程序的类型,此参数可以是以下值之一:
 

含义

WH_CALLWNDPROC(4)

安装一个钩子处理程序,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见 CallWndProc 钩子处理程序

WH_CALLWNDPROCRET(12)

安装一个钩子处理程序,它对已被目标窗口处理程序处理过了的消息进行监视,详情参见 CallWndRetProc 钩子处理程序

WH_CBT(5)

安装一个钩子处理程序,接受对基于计算机训练(CBT)应用程序有用的消息,详情参见 CBTProc 钩子处理程序

WH_DEBUG(9)

安装一个钩子处理程序以便对其他钩子处理程序进行调试,详情参见 DebugProc 钩子处理程序

WH_FOREGROUNDIDLE(11)

安装一个钩子处理程序,该钩子处理程序当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务,详情参见 ForegroundIdleProc 钩子处理程序

WH_GETMESSAGE(3)

安装一个钩子处理程序对发送至消息队列的消息进行监视,详情参见 GetMsgProc 钩子处理程序

WH_JOURNALPLAYBACK(1)

安装一个钩子处理程序,该钩子发送先前由WH_JOURNALRECORD 钩子处理程序纪录的消息,详情参见JournalPlaybackProc 钩子处理程序

WH_JOURNALRECORD(0)

安装一个钩子处理程序,对发送至系统消息队列的输入消息进行纪录,详情参见 JournalRecordProc 钩子处理程序

WH_KEYBOARD(2)

安装一个钩子处理程序,对按键消息进行监视,详情参见KeyboardProc 钩子处理程序

WH_KEYBOARD_LL(13)

安装一个钩子处理程序,用来监视底层的键盘输入事件(此钩子只能在 Windows NT 中安装),详情参见LowLevelKeyboardProc 钩子处理程序

WH_MOUSE(7)

安装一个钩子处理程序,对鼠标消息进行监视,详情参见MouseProc 钩子处理程序

WH_MOUSE_LL(14)

安装一个钩子处理程序,用来对底层的鼠标输入事件进行监视(此钩子只能在 Windows NT 中安装),详情参见LowLevelMouseProc 钩子处理程序

WH_MSGFILTER(-1)

安装一个钩子处理程序,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息,详情参见 MessageProc 钩子处理程序

WH_SHELL(10)

安装一个钩子处理程序,以接收对命令行应用程序有用的通知, 详情参见 ShellProc 钩子处理程序

WH_SYSMSGFILTER(6)

安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc 挂钩处理过程

lpfn

1. 指向相应的钩子处理过程

2. 若参数 dwThreadId 为 0 或者指定了一个其他进程创建的线程标识符,则参数 lpfn 必须指向一个动态链接库中的钩子处理过程;否则,参数 lpfn 可以指向一个与当前进程相关的代码中定义的钩子处理过程

hMod

1. 指向一个动态链接库的句柄,该动态连接库包含了参数 lpfn 所指向的钩子处理过程

2. 若参数 dwThreadId 指定的线程由当前进程创建,并且相应的钩子处理过程定义于当前进程相关的代码中,则参数 hMod 必须被设置为 NULL

dwThreadId

1. 指向一个与线程相关钩子处理过程的线程标识符

2. 对桌面应用来说,若此参数值为 0,则该钩子处理过程与运行在同一桌面的所有现存的线程相关

2. 对于 Windows 商店应用,参见备注



返回值:

1. 如果函数调用成功,则返回值就是该钩子处理过程的句柄;

2. 如果函数执行失败,则返回值为 NULL。

获取有关错误的更多信息,请调用 GetLastError 函数。


备注:

1. SetWindowsHookEx 函数可以用来将一个 DLL 注入另一个进程。但是一个 32 位的 DLL 不能注入一个 64 位的进程中;一个 64 位的 DLL 不能注入一个 32 位的进程。如果一个应用程序需要在其他进程使用钩子,它要求一个 32 位的应用程序调用 SetWindowsHookEx 将一个 32 位的 DLL 注入 32 位的进程,一个 64 位的应用程序调用 SetWindowsHookEx 将一个 64 位的 DLL 注入 64 位的进程。32 位和 64 位的 dll 必须有不同的名称。

2. 因为钩子运行在应用程序的上下文中,他们必须匹配应用程序的“位数”。如果一个 32 位的应用程序在 64 位 Windows 系统安装全局钩子,该 32 位钩子被注入到每个 32 位进程(通常的安全边界启用)。在一个 64 位的进程中,那些线程仍然标记为"连接"。然而,因为 32 位的应用程序必须运行钩子代码,系统执行钩子过程在连接应用程序的上下文;具体来说,叫做 SetWindowsHookEx 的线程。这意味着连接应用程序必须继续抽取消息,这也可能阻止 64 位进程的正常功能。

3. 如果一个 64 位的应用程序在 64 位 Windows 系统安装全局钩子,该 64 位钩子注入每一个 64 位的进程,而所有 32 位进程使用一个回调以连接应用程序。

4. 为了在 64 位的 Windows 安装桌面上连接所有应用程序,安装一个 32 位全局钩子和一个 64 位全局钩子,从每个适当的流程,确保在连接应用程序抽取消息以避免阻塞正常功能。如果您已经有一个 32 位全局连接的应用程序,它不需要在每个应用程序的上下文中运行,您可以不创建一个 64 位的版本钩子。

5. 如果 hMod 参数是 NULL 可能发生错误,dwThreadId 参数为 0 或指定由另一个进程创建的线程标识符。

6. 调用 CallNextHookEx 函数链到下一个钩子程序是可选的,但强烈推荐您这样做;否则,其他应用程序安装的钩子将不会接收钩通知,可能表现不正确结果。您应该调用 CallNextHookEx 函数,除非您需要绝对防止其他应用程序被通知。

7. 在终止程序之前,应用程序必须调用 UnhookWindowsHookEx 函数释放与该钩子相关系统资源。

8. 钩子的范围取决于钩子类型。一些钩子仅可以设置在全局范围;一些钩子仅可以设置一个特定的线程,见下表:
 

钩子

范围

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

仅全局


9. 对于指定的钩子类型,线程钩子首先被调用,然后是全局钩子。安装钩子线程而不是处理钩子线程可以在线程中调用 WH_MOUSE , WH_KEYBOARD , WH_JOURNAL * ,WH_SHELL ,低优先级钩子。对于这些钩子,如果在钩子链中 32 位钩子在 64 位钩子的前面,那么 32 位和 64 位钩子被调用是可能的。

10. 全局钩子共享资,在同一桌面安装一个钩子影响到所有应用程序调用线程。所有的全局钩子函数必须在库中。全局钩子应该限于专用应用程序或应用程序调试期间作为发展援助。当库不再需要钩子时,应该移除钩子过程。

11. Windows 商店应用程序开发如果 dwThreadId 是零,因为 Windows 商店应用程序进程和安装 Windows 运行时代理进程那么窗口钩 dll 没有加载进进程内,除非他们通过 UIAccess 进程(辅助工具)安装。为下列的钩子传递通知到这些钩子的安装程序线程:
 

·         WH_JOURNALPLAYBACK

·         WH_JOURNALRECORD

·         WH_KEYBOARD

·         WH_KEYBOARD_LL

·         WH_MOUSE

·         WH_MOUSE_LL


12. 这种行为类似于钩子 DLL 目标应用程序进程不匹配,例如,当钩子 DLL 是 32 位和应用过程是 64 位。


需求:
 

Minimum supported client

Windows 2000 专业版 [仅桌面应用程序]

Minimum supported server

Windows 2000 服务器版 [仅桌面应用程序]

Header

Winuser.h (包含于 Windows.h)

Library

User32.lib

DLL

User32.dll

Unicode and ANSI names

SetWindowsHookExW (Unicode) 和 SetWindowsHookExA (ANSI)

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1283 更新时间:2017-6-19 19:51:35  【打印此页

上一条:EnumWindows

下一条:GetTickCount

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修