WindowsHook钩子函数详解讲述.docx
- 文档编号:27592994
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:43
- 大小:34.16KB
WindowsHook钩子函数详解讲述.docx
《WindowsHook钩子函数详解讲述.docx》由会员分享,可在线阅读,更多相关《WindowsHook钩子函数详解讲述.docx(43页珍藏版)》请在冰豆网上搜索。
WindowsHook钩子函数详解讲述
WindowsHook(钩子)函数详解
钩子类型
WH_MSGFILTER(MessageProc)
函数功能:
挂钩处理过程是应用程序或库中定义的回调函数,它与函数SetWindowsHookEx搭配使用.当一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理之前,系统对此挂钩处理过程进行调用.此函数可以对一个特定应用程序或所有应用程序的对话框、消息框、菜单条、或滚动引发的条消息进行监视.
类型HOOKPROC定义了指向此类回调函数的指针.MessageProc是库中相应回调函数名的位置标志符.
函数原形:
LRESULTCALLBACKMessageProc(intcode,WPARAMwParam,LPARAMlParam);
参数:
nCode:
指示产生此消息的输入事件类型.此参数可以是以下值之一:
若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数CallNextHookEx并返回其返回值
值
MSGF_DDEMGR
当动态数据交换管理库(DynamicDataExchangeManagementLibrary(DDEML)正在等待一个同步处理的结束时产生此事件,关于DDEML的详情,参见DynamicDataExchangeManagementLibrary.
0
MSGF_DIALOGBOX
输入事件由一个消息框或者对话框产生.
1
MSGF_MESSAGEBOX
2
MSGF_MENU
输入事件由一个菜单条产生.
5
MSGF_SCROLLBAR:
输入事件由一个滚动条产生.
6
MSGF_NEXTWINDOW
输入事件由于用户摁下组合键
8
MSGF_MAX
4096
MSGF_USER
wParam:
为NULL(0).
lParam:
指向MSG结构的[指针].
返回值:
若nCode的值小于0,则此挂钩处理过程必须返回CallNextHookEx的返回值.若nCode的值大于或等于0,并且此挂钩处理过程未对该消息进行处理,则调用函数CallNextHookEx并返回其返回值是被推荐的.否则,其他安装了WH_MSGFILTER挂钩的应用程序将无法收到此挂钩通知,并可能由此导致错误的行为.若此挂钩处理过程处理了此消息,它应返回一个非0值以避免系统再将此消息传送给挂钩链上的其他挂钩处理过程或目标窗口处理过程.
备注:
一个应用程序通过调用函数SetWindowsHookEx指定WH_MSGFILTER挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.
若一个应用程序使用了DDEML并实行同步处理,而且要求必须在消息被分派前处理之,则一定要使用WH_MSGFILTER挂钩.
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户自定义.
WH_JOURNALRECORD(JournalRecordProc)
函数功能:
该函数处理过程是应用程序或库定义的回调函数,它与函数SetWindowsHookEx搭配使用,此函数纪录系统从系统消息队列中删除的消息,此后,一个应用程序可以通过使用挂钩处理过程JournalPlaybackProc对此消息进行回调.
类型HOOKPROC定义了指向此类回调函数的指针,JournalRecordProc是应用程序定义或库定义的相应回调函数名的位置标识符.
函数原形:
LRESULTCALLBACKJournalRecordProc(intcode,WPARAMwParam,LPARAMlParam);
参数:
Code:
指示如何处理此消息,此参数可以是以下值之一:
HC_ACTION
参数LPARAM指向结构EVENTMSG,该结构包含从系统消息队列中删除了的消息的有关信息,此挂钩处理过程必须纪录下此结构的内容,将其拷贝到一个缓冲区或文件中.
HC_SYSMODALOFF
一个系统的有模式对话框正在被销毁,此挂钩处理过程必须进行纪录.
HC_SYSMODALON
一个系统的有模式对话框正在被显示,此挂钩处理过程必须停止纪录.
若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.
wParam:
指定为NULL(0).
lParam:
指向结构EVENTMSG,该结构包含将被纪录的消息.
返回值:
返回值被忽略.
备注:
一个JournalRecordProc挂钩处理过程必须拷贝但不能修改此消息,在次挂钩处理过程控制交还给系统之后,此消息继续被处理.
安装一个JournalRecordProc挂钩处理过程是通过调用函数SetWindowsHookEx指定WH_JOURNALRECORD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.过程并非只能存在于动态链接库中,一个应用程序自身也可拥有自己的JournalRecordProc挂钩处理过程.
与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc总是在设置了该挂钩的线程上下文中被调用.一个安装了JournalRecordProc挂钩处理过程的应用程序该对虚拟键VK_CANCEL进行监视(在大多数键盘上,虚拟键VK_CANCEL被实现为组合键
这种作为终止日志纪录信号的角色使得组合键
即
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户定义
WH_JOURNALPLAYBACK(JournalPlaybackProc)
函数功能:
该函数处理过程是应用程序或库定义的回调函数,它与函数SetWindowsHookEx搭配使用.典型地,一个应用程序通过调用此函数来对先前有JournalRecordProc挂钩处理过程纪录的一系列鼠标和键盘消息进行回放.一旦挂钩函数JournalPlaybackProc挂钩处理过程被安装,则通常的鼠标和键盘输入被禁止.
类型HOOKPROC定义了指向此类回调函数的指针,JournalPlaybackProc是应用程序定义或库定义的相应回调函数名的位置标识符.
函数原形:
LRESULTCALLBACKJournalPlaybackProc(intcode,WPARAMwParam,LPARAMlParam);
参数:
code:
指示一个代码,被挂钩处理过程用来决定如何处理此消息,这个参数可以是以下值之一:
HC_GETNEXT
挂钩处理过程必须将当前的鼠标或键盘消息拷贝至由参数lParam所指结构EVENTMSG中.
HC_NOREMOVE
一个正用wRemoveMsg为参数调用了PeekMessage的应用程序对PM_NOREMOVE标志进行设置,指示此消息在经过函数PeekMessage的处理之后,并不从消息队列中被删除.
HC_SKIP
此挂钩处理过程必须准备拷贝下一个鼠标或键盘消息至由参数lParam所指定的结构EVENTMSG中去,依据收到的代码HC_GETNEXT,此挂钩处理过程必须将消息拷贝至结构EVENTMSG中去.
HC_SYSMODALOFF
一个的有系统模式对话框已被销毁,此挂钩处理过程必须恢复对此消息的回调.
HC_SYSMODALON
一个的有系统模式对话框正在被显示,直至此对话矿被销毁之前,此挂钩处理过程必须停止对消息的回调.
若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值.
wParam:
指示一个NULL(0)值
lParam:
指向一个EVENTMSG结构,该结构反映了正被此挂钩处理函数处理的消息,这个参数仅当参数nCode的值是HC_GETNEXT时才有效.
返回值:
为使系统在处理此消息之前先等待一段时间,返回值必须为一个以时钟计的时间量,该时间量指出了系统的等待时间长短.(此时间量可通过计算当前输入的消息与上一个输入消息的time成员的差别获得),若希望立即处理此消息,返回值应为0,此返回值仅当挂钩代码为HC_GETNEXT时才被使用,否则,此返回值被忽略.
备注:
一个JournalPlaybackProc挂钩处理过程应当将输入消息拷贝给lParam参数,此消息必须是在先前使用JournalRecordProc挂钩处理过程时被纪录过的,在使用JournalRecordProc挂钩处理过程时,不应对此消息进行修改,为了多次获得相同的消息,此挂钩处理过程可以多次以HC_GETNEXT为参数被调用.
若nCode的值为HC_GETNEXT而返回值大于0,则系统按返回值指定的毫秒值进入睡眠状态,当系统开始继续执行时,它会以HC_GETNEXT为参数nCode的值再次调用次挂钩处理过程以获得相同的消息,此次调用JournalPlaybackProc的返回值为0,否则,系统又将回到睡眠状态,并以此次调用JournalPlaybackProc返回的毫秒数为睡眠时间,睡眠时间到后再重复上述操作.这就使得系统表现为被挂起.
与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc总是在设置了该挂钩的线程上下文中被调用.
在此挂钩处理过程将控制返回给系统后,此消息继续被处理.若nCode的值为HC_SKIP,则此挂钩处理过程必须准备在它下一次被调用时返回下一个纪录了的事件消息,安装JournalPlaybackProc挂钩处理过程通过调用函数SetWindowsHookEx,指定WH_JOURNALPLAYBACK挂钩类型及相应挂钩处理过程首地址来实现,如果用在日志回调过程中按下
若此挂钩处理过程返回的消息在WM_KEYFIRST或WM_KEYLAST的范围内,则以下情形发生.
结构EVENTMSG的paramL成员指示按下的虚拟键编码值,结构EVENTMSG的paramH成员指示扫描吗,这种情况下无法指示出重复按键的次数,这个事件仅表示一个按键事件.
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户定义.
WH_KEYBOARD(KeyboardProc)
函数功能:
该函数是应用程序或库文件定义的回调函数,它与函数SetWindowsHookEx搭配使用,当应用程序调用函数GetMessage或PeekMessage并且当前恰好有一个键盘消息(WM_KEYUPorWM_KEYDOWN)将要被处理时,系统就调用此挂钩处理过程.
类型HOOKPROC定义了指向此类回调函数的指针,KeyboardProc是应用程序定义或库定义的相应回调函数名的位置标识符.
函数原形:
LRESULTCALLBACKKeyboardProc(intcode,LPARAMlParam);
参数:
code:
指定一个代码,该代码被挂钩处理过程用于决定如何处理此消息,此参数可以为以下值之一:
HC_ACTION
参数wParam和lParam包含一个击键消息的信息.
HC_NOREMOVE
参数wParamandlParam包含一个击键消息的信息,并且此击键消息尚未从消息队列中被删除(一个应用程序调用函数PeekMessage并设置了PM_NOREMOVE标志).
若nCode的值小于0,则此挂钩函数必须不加处理地传送给函数CallNextHookEx,并返回其返回值.
wParam:
按键的虚拟键值消息,例如:
VK_F1
lParam:
指示重复次数,扫描码,扩展标志,上下文代码,此前的键状态标志和变化状态标志,此参数可以是以下值的组合值:
0-15位
描述:
按下键盘次数。
Int16=lParam &0x0f
16-23位
指定扫描码.依赖于OEM,此值依赖于键盘生产厂家.
第24位
当24位为1时候:
表示按键是扩展键
当24位为0时候:
表示按键是是数字键盘按键
BOOL bNumLock = lParam & (1 << 24);
25-28位
保留未用.
第29位
上下文键:
为1时:
ALT按下,其他情况为0
BOOL bAltKeyDown = lParam & (1 << 29);
第30位
如果是按键按下后发送的消息,30位为1,如果是按键抬起后30位为0;
BOOL bSendKeyDown = lParam & (1 << 30);
第31位
指定转变状态:
31位为0时候,按键正在被按下,为1时候,按键正在被释放
BOOL bKeyUp = lParam & (1 << 31);
欲获得更多关于此lParam参数的信息,请参见KeystrokeMessageFlags.
返回值:
若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,并且此挂钩处理过程并未对此消息进行处理,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WH_KEYBOARD的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程对此消息进行了处理,它应返回非0值以避免系统将此消息传递给挂钩键上的其他处理过程或目标窗口的处理过程.
备注:
一个应用程序通过调用函数SetWindowsHookEx指定WH_KEYBOARD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户自定义.
WH_GETMESSAGE(GetMsgProc)
函数功能:
该函数处理过程是应用程序或库定义的回调函数,它与函数SetWindowsHookEx搭配使用,每当函数GetMessage从应用程序的消息队列中获得了一个消息时,系统就调用此函数,在将此获得的消息传送给相应窗口处理过程之前,系统将此消息传送给该挂钩处理过程.
类型HOOKPROC定义了指向此类回调函数的指针,GetMsgProc是应用程序定义或库定义的相应回调函数名的位置标识符.
函数原形:
LRESULTCALLBACKGetMsgProc(intcode,WPARAMwParam,LPARAMlParam);
参数:
Code:
指示挂钩处理过程是否必须处理此消息.若nCode的值是HC_ACTION,则挂钩处理过程必须处理此消息,若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.
wParam:
指示此消息是否已从消息队列中被删除,此参数可以是以下值之一:
PM_NOREMOVE
:
指出该消息尚未从消息队列中被删除(一个应用程序调用函数PeekMessage,设置PM_NOREMOVE标志).
PM_REMOVE
指出该消息已从消息队列中被删除.(一个应用程序调用函数GetMessage或PeekMessage,设置PM_REMOVE标志.)
lParam:
指向结构MSG,该结构包含了关于此消息的详细消息
返回值:
若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_GETMESSAGE的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程没有调用函数CallNextHookEx,则返回值为0.
备注:
挂钩处理过程GetMsgProc可以检查和修改此消息,在此挂钩处理过程将控制返回给系统之后,函数GetMessage将此修改后的消息返回给最初调用他的应用程序,应用程序通过调用函数SetWindowsHookEx指定WH_GETMESSAGE挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户定义.
WH_CALLWNDPROC(CallWndProc)
函数功能:
该函数挂钩处理过程是由应用程序定义或由库定义的回调函数,它与函数SetWindowsHookEx配套使用,系统调用此函数无论何时一旦函数SendMessage被调用,在将消息发送至相应的窗口处理过程之前,系统先将该消息发送至挂钩处理过程,该挂钩处理过程可以对改消息进行检查,但不能修改之.
类型HOOKPROC定义了指向此类回调函数的指针,CallWndProc是应用程序定义或库定义的函数名的位置标志位.
函数原形:
LRESULTCALLBACKCallWndProc(intnCode,WPARAMwParam,LPARAMlParam);
参数:
nCode:
指定该挂钩处理过程是否必须对该消息进行处理,若nCode是HC_ACTION,则该挂钩处理过程必须处理该消息.若nCode的值小于0,则此挂钩处理过程必须在未对该消息作进一步处理的情况下,将其发送给函数CallNextHookEx并返回由CallNextHookEx返回的值.
wParam:
指示该消息是否由当前线程发出,若该消息由当前线程发出,其值为非0值,否则,其值为0.
lParam:
指向一个CWPSTRUCT结构,该结构包含了此消息的详细消息.
返回值:
若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了WM_CALLWNDPROC挂钩的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩没有调用函数CallNextHookEx,则返回值为0.
备注:
挂钩处理函数CallWndPro可以对消息进行检查,但不能修改之.在该挂钩处理过程将控制返回给系统之后,该消息被发送至相应的窗口过程.
一个应用程序通过调用SetWindowsHookEx时指定WM_CALLWNDPROC挂钩类型及其相应挂钩处理过程的首地址来安装挂钩处理过程.
挂钩WM_CALLWNDPROC是在调用函数SendMessage的线程中被调用的,它并非在接受消息的线程中被调用.
速查:
WindowsNT:
3.1以及以上版本,Windows:
95以及以上版本,WindowsCE不支持,头文件:
winuser.h,库文件:
用户定义.
WH_CBT(CBTProc)
函数功能:
该函数挂钩处理过程是在应用程序或库中定义的回调函数,它与函数SetWindowsHookEx配套使用,系统在缉获、创建、销毁、最小化、最大化、移动或改变一个窗口尺寸之前调用它;在结束一个系统命令之前调用它;在将一个鼠标或键盘事件从系统事件队列中删除之前调用它;在设置键盘焦点之前调用它,或在与系统消息队列进行同步之前调用它,一个基于计算机培训(CBT)的应用程序使用此挂钩处理过程来从系统接收有用的通知.
类型HOOKPROC定义了指向此类回调函数的指针,CBTProc是应用程序定义或库定义的相应回调函数名的位置标识符.
函数原形:
LRESULTCALLBACKCBTProc(intnCode,WPARAMwParam,LPARAMlParam);
参数:
nCode:
指定一个代码,该代码被此挂钩处理过程用来决定如何处理此消息,该参数可以是下值中的一个:
HCBT_ACTIVATE:
系统将要激活一个窗口.
HCBT_CLICKSKIPPED:
系统已经从系统消息队列中删除了一个鼠标消息,依据收到的这一挂钩代码,一个CBT应用程序必须安装一个WH_JOURNALPLAYBACK挂钩处理过程以响应此鼠标消息.
HCBT_CREATEWND:
一个窗口将要被创建,系统在发送WM_CREATE或WM_NCCREATE消息至相应窗口之前调用该挂钩处理过程.若该挂钩处理过程返回一个非0值,则系统销毁该窗口,函数CreateWindow返回值为NULL(0),但消息WM_DESTROY不会被发送至相应窗口,若挂钩处理过程返回为零,窗口将被正常创建.
当HCBT_CREATEWND通知发出之时,相应窗口已被创建,但其最终尺寸及位置可能尚未确定,其父窗口也可能还尚未被创建,存在这样一种可能,消息被发送给新被创建的窗口,虽然该窗口尚未接收到WM_NCCREATE或WM_CREATE消息.也可能通过对CBT_CREATEWND结构的hwndInsertAfter域的修改,来改变新被创建窗口在Z序列中的位置.
HCBT_DESTROYWND
一个窗口将被销毁
HCBT_KEYSKIPPED
系统已从系统消息队列中删除了一个键盘消息,依据收到的这个挂钩代码,一个CBT应用程序必须安装一个WH_JOURNALPLAYBACK挂钩处理过程以响应相应的键盘消息.
HCBT_MINMAX
一个窗口将被最小化或最大化.
HCBT_MOVESIZE
一个窗口将被移动或改变尺寸.
HCBT_QS
系统已从系统消息队列中取到一个WM_QUEUESYNC消息.
HCBT_SETFOCUS
一个窗口将要获得键盘焦点.
HCBT_SYSCOMMAND
一个系统命令将被执行.这使得一个CBT应用程序可以避免因热键响应而进行任务切换.
若nCode的值小于0,此挂钩处理过程必须不加处理地将此消息发送给函数CallNextHookEx,并返回函数CallNextHookEx的返回值.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WindowsHook 钩子 函数 详解 讲述