钩子函数的原理c/c++?钩子函数的钩子函数
本文目录
钩子函数的原理c/c++
我的个人理解: 钩子函数其实就是函数指针,系统或软件定义好一些钩子,而你来把这些钩子挂接起来!说白了就是有些动作系统需要针对不同的情况做不同的处理,此时就需要定义一个钩子。具体的操作由用户挂上的钩子函数实现.比如: #include “stdio.h“void (*g_say_func)(void);void regist_say( void (*pfunc)(void ) ){ g_say_func = pfunc;}void humen_say(){ printf(“hello world!!!\n“);}void dog_say(){ printf(“wo wo !!!\n“);}void cat_say(){ printf(“miao miao!!!“);}void say_hello(){ g_say_func();}void main(){ regist_say(dog_say); //注册钩子函数 say_hello();}以上纯粹是个人理解!
钩子函数的钩子函数
一共有两种类型的钩子:局部的和远程的。局部钩子仅钩挂您自己进程的事件。远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:钩子分两种, 一种是系统级的全局钩子; 一种是线程级的钩子.全局钩子函数需要定义在 DLL 中, 线程级的钩子开始比较简单.其实钩子函数就三个:设置钩子: SetWindowsHookEx释放钩子: UnhookWindowsHookEx继续钩子: CallNextHookEx在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程的 ID
什么是钩子函数
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 = 91Public Const KEY_WINMENU = 93 Global hHook As Long Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongIf nCode 》= 0 ThenIf wParam = KEY_WINMENU Or wParam = KEY_WINSTART ThenIf (lParam And &HC0000000) = 0 ThenMsgBox ““, , ““KeyboardProc = 1Exit FunctionEnd IfEnd IfEnd IfKeyboardProc = 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.ShowEnd Sub Private Sub form_Unload(Cancel As Integer)Call UnhookWindowsHookEx(hHook)End Sub
JS钩子函数与回调函数区别
在消息处理机制中必不可少的一组CP,即回调和钩子。
钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式。
接下来是一段js代码,主要用于给btn设置点击的钩子函数
let btn = document.getElementById(“btn“);btn.onclick = () =》 { console.log(“i’m a hook“);}钩子是在捕获消息的时候立即执行钩子函数。
下面是一段给btn添加click的监听器。
btn.addEventListener(“click“,() =》{ console.log(this.onclick);//undefined});这是给btn绑定了一个监听器,后面那个函数是它的回调函数,因为消息捕获的过程我们并不能参与,而在捕获执行完毕的时候,回调函数才会执行,我们可以把对消息的处理写在回调函数里。
js由于自身的特殊性(单线程),因而在代码里充满各式各样的异步操作,因此回调函数也是铺天盖地,上面的两段代码都是异步的。
回调函数和钩子函数的区别 根本上,他们都是为了捕获消息而生的,但是钩子函数在捕获消息的第一时间就会执行,而回调函数是在整个捕获过程结束时,最后一个被执行的。
回调函数其实就是调用者把回调函数的函数指针传递给调用函数,当调用函数执行完毕时,通过函数指针来调用回调函数。
钩子函数有多少种
应该分为 消息钩子和API/地址钩子,API/地址钩子又可以细分为 inline,IAT,SSDT等,参考bbs.pediy.com
本文相关文章:

什么叫函数返回为什么要返回?vb中经常提到的“返回”是什么意思
2025年4月1日 12:30

settimeout函数(如何通俗的解释递归、闭包、回调、自调用函数等,这些情况之间有哪些区别和联系)
2025年3月29日 07:10

index函数怎么用match(比VLOOKUP函数好用10倍的函数Index+match函数怎么用)
2025年3月21日 08:00

sumproduct多条件不重复计数(excel中用什么函数能计算特定条件下某一列的不重复的个数)
2025年3月18日 19:00

round函数(请问ROUND函数是什么意思比如ROUND(SUM(D1*8)*2))
2025年3月15日 09:50

sumifs函数(哪位大神能帮我详细概括下,SUMIF函数和SUMIFS函数的区别如何)
2025年3月1日 08:40

replace函数(excel里的这个函数REPLACE 怎么用具体参数怎么设置呢)
2025年2月18日 04:50
更多文章:

js是什么软件(解释js ajax和cgi各是什么工具在b/s中起什么作用)
2025年2月14日 07:00

winform刷新窗体数据(winform中一个窗口关闭后在主窗口上自动刷新显示的数据谢谢)
2025年2月11日 13:40

society of actuaries(数学系跨专业考研)
2025年2月25日 10:20

boarding是什么意思啊(boarding check是什么意思啊)
2025年3月7日 14:20

position属性relative(position定位属性中absolute和relative的区别)
2025年2月23日 00:00

pilot音标(英语China’s largest pilot怎么翻译)
2025年3月31日 21:00

javascript是一种什么语言(javascript属于什么样的语言)
2025年4月4日 09:40

史上最贵的域名cars.com价值8.7亿美金,大家觉得cars.vip怎么样?cars.com和cars.vip这两个域名哪个好
2025年3月17日 02:50

webapi测试(webapi 返回类型到底应该是什么才合适,这是个问题)
2025年3月3日 13:20

jqgrid隐藏列(jqgrid控制列的隐藏显示,怎么使table的宽度不变)
2025年2月13日 21:30

equalsandhashcode(hashcode和equals的关系是什么)
2025年2月18日 19:20