问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

什么是钩子函数

发布网友 发布时间:2022-04-22 22:22

我来回答

1个回答

热心网友 时间:2022-04-22 23:11

WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。

局部钩子仅钩挂您自己进程的事件。

远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:

基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。

系统范围的 将捕捉系统中所有进程将发生的事件消息。 当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。

钩子一共有14种,以下是它们被调用的时机:

WH_CALLWNDPROC 当调用SendMessage时
WH_CALLWNDPROCRET 当SendMessage的调用返回时
WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时
WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时
WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时
WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时
WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。
WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时
WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时
WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.
WH_CBT 当基于计算机的训练(CBT)事件发生时
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用
WH_DEBUG 用来给钩子函数除错

附:如何使用钩子函数(接收到字母A按下时,窗体由最小化弹出的完整的代码)

Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Public Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Public Const WH_KEYBOARD = 2

Public Const KEY_WINSTART = 91
Public Const KEY_WINMENU = 93

Global hHook As Long

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode >= 0 Then
If wParam = KEY_WINMENU Or wParam = KEY_WINSTART Then
If (lParam And &HC0000000) = 0 Then
MsgBox "", , ""
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

Option Explicit

Private Sub Command1_Click()
form2.Show 1

End Sub

Private Sub form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
Me.Show
End Sub

Private Sub form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
平安e家保是什么险 2023年高级会计师报名时间和条件 2022高级会计师报考条件要求是什么? 问几个英文语法问题,希望能正确回答~ 女生锁骨下长痣,左右都有 不是很对称 寓意什么呐? 抖音上传照片音乐短怎么办 断夜奶好方法 婴儿断夜奶最佳方法 建设银行,你打算坑害多少优质客户? 【PS教程】如何做出凹陷字体效果的氛围海报 亍字没有那个钩念什么? 横撇弯钩 这个笔画用五笔或者搜狗怎么打出来,还有左耳旁这个偏旁该怎么打?谢谢啦! 键盘26个字母口诀? 钓鲢鳙用几号钩好? 钩针的符号是什么? 为什么讯飞鼠标语音输入时只显示问号 笔画横斜钩五笔怎么打 扁担钩学名是什么? 空调内机为什么总是滴水? 暗黑破坏神2哪个职业厉害点啊?? 暗黑破坏神是一款什么样的游戏? 暗黑破坏神出现在地表,是在哪? 暗黑破坏神2一共有几个版本? 《暗黑破坏神2》的背景故事是什么? 暗黑破坏神2所有任务详解有哪些? 可以在网上挂失平安银行卡吗?要怎么做? 平安银行卡丢失了,可以补办卡号和原来一样的吗?急 平安银行卡挂失后u盾还可以用吗? 如何取消深圳平安银行的电话挂失 平安银行卡和u盾怎么挂失 五笔里左弯钩那怎么打 类似メ CAD里怎样将文字转换为线条 我想编辑cad图纸里的文字,但是现在整张图是一个块,炸开之后文字变成线条了,我该怎么办? CAD2007图中文字怎么分解成线? CAD炸开文字 CAD如何炸开文字? 如何在CAD中将艺术文字炸开,成为线条组成文字 CAD里面怎么把文字转成线条? CAD里怎样把文字转成线条? 怎么把CAD中的文字分解成线段? 在CAD里如何把文字变成点阵或线条? AutoCAD中的字怎么打散成线条的详细说明 cad文字打散炸开用什么指令?在工具栏哪里能找到? CAD里面炸开字体是什么命令 用AutoCAD把文字转换成线条 cad中的字怎么打散成线条 cad文字编辑时,如何将文字分解成线? cad如何将黑体字炸开转换成线条 得物华为手机怎么虚拟试鞋? 是不是有一款模拟吸毒人脸变化的软件?