SetWindowsHookEx函数参数详解

 

 

   Windows系统钩子(键盘钩子,鼠标钩子等等)已是我们最长用的手段,要做钩子程序就必须用到下面这几个函数使用动态链接库(dll),即要实现全局系统钩子。这里就这几个函数的参数做一下详细的讲解。

需要使用到WindowsAPI中的两个函数:
一. HHOOK SetWindowsHookEx(
int idHook,         //要安装的钩子类型 (参考下面的IdHook取值)
HOOKPROC lpfn,   //钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,须定义在DLL中,
HINSTANCE hMod,    //应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包含HookProc的动态库加载地址。否则给0就可以了,即勾自己。
DWORD dwThreadId;   //要安装钩子的线程ID ,指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。);

 

其中idHook参数可以取如下常量:
WH_CALLWNDPROC     //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
WH_CALLWNDPROCRET     //窗口钩子,当窗口处理完消息后将触发此钩子
WH_CBT   //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
WH_DEBUG    //调试钩子
WH_GETMESSAGE    //当往消息队列中增加一个消息时将触发此钩子
WH_JOURNALPLAYBACK     //回放钩子,可以用于播放已记录的鼠标和键盘的操作
WH_JOURNALRECORD     //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
WH_KEYBOARD     //当敲击键盘时将触发此钩子
WH_MOUSE    //当有鼠标操作时将触发此钩子
WH_MSGFILTER   //消息过滤钩子
WH_SHELL   //Shell钩子
WH_SYSMSGFILTER    //系统消息过滤钩子

 

使用WH_CBT系统级钩子,当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件,我们在自定义消息函数中只处理关闭 窗口的消息,在自定义的钩子函数若返回0则允许对窗体的操作,返回1则阻止窗口最大化、最小化等操作。

缉获、创建、销毁、最小化、最大化、移动或改变一个窗口尺寸之前调用它
在结束一个系统命令之前调用它;在将一个鼠标或键盘事件从系统事件队列中删除之前调用它;在设置键盘焦点之前调用它,或在与系统消息队列进行同步之前调用它,一个基于计算机培训(CBT)的应用程序使用此挂钩

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的返回值.

 

wParam:取决于参数nCode的值,详细信息参见以下的说明部分.

 

lParam:取决于参数nCode的值,详细信息参见以下的说明部分.

 

返回值:此挂钩处理过程的返回值决定了系统允许或禁止以下操作之一,对于与以下挂钩代码相应的操作,返回值为0则允许这样的操作,返回值为1则禁止.

HCBT_ACTIVATE

HCBT_CREATEWNDHCBT_DESTROYWND

HCBT_MINMAX

HCBT_MOVESIZEHCBT_SETFOCUS

HCBT_SYSCOMMAND

对于与以下CBT挂钩代码相对应的操作,返回值被忽略.

HCBT_CLICKSKIPPED

HCBT_KEYSKIPPED

HCBT_QS

 


WH_CBT Hook
当系统发生以下事件时,调用
WH_CBT hook
函数:
before activating, creating, destroying,
minimizing, maximizing, moving, or sizing a window; before completing a system
command; before removing a mouse or keyboard event from the system message
queue; before setting the input focus; or before synchronizing with the system message
queue. CBT hook
主要应用于computer-based traing程序

WH_SHELL Hook
shell程序使用WH_SHELL钩子获得重要的信息。
windows在shell程序将要被激活或顶级窗口被创建和删除是调用WH_SHELL

ShellProc

函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用.此函数从系统接受外壳(shell)通知.类型HOOKPROC定义了指向此类回调函数的指针.ShellProc时应用程序或库中定义的相应回调的位置标志符.

 

函数原形:LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam,LPARAM lParam );

 

参数:

nCode:指示挂钩类型,该参数可以是以下值之一:

HSHELL_ACCESSIBILITYSTATE: 对Windows NT5.0或以上版本有效,指示"可访问性"已被改变.

 

HSHELL_ACTIVATESHELLWINDOW: shell应当激活其主窗口.

 

HSHELL_GETMINRECT: Windows 95 only: 一个窗口正在被最小化或者最大化,系统需要该窗口被最小化时的矩形坐标.

 

HSHELL_LANGUAGE   : Windows 95 only: 键盘语言被改变或者一个新的键盘布局被加载.

 

HSHELL_REDRAW:    Windows 95 only: 一个窗口在任务条上的标题已被重画.

 

HSHELL_TASKMAN:   Windows 95 only: 用户已选择其任务列表.一个提供了任务的列表的shell应用程序当返回TRUE,以阻止Windows开始(执行)其任务列表.

 

HSHELL_WINDOWACTIVATED: Windows 95 only: 激活状态已被转移给一个不同的顶层无属性主窗口.

 

HSHELL_WINDOWCREATED: 一个顶层无属性主窗口已被创建.当系统调用一个SheProc函数时,该窗口存在.

HSHELL_WINDOWDESTROYED:一个顶层无属性主窗口即将销毁.当系统调用SheProc 函数时.该窗口仍然存在.

若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数CallNextHookEx 并返回其返回值.

 

wParam: 此参数的值依赖于参数nCode,其依赖关系如下所示:

HSHELL_ACCESSIBILITYSTATE: 指示哪一个可以访问特征已被改变了状态,可以是以下值之一:

ACCESS_FILTERKYS,ACCESS_MOUSEKEYS,ACCESS_STICKKEYS.

HSHELL_GETMINRECT:被最小化或者最大化的窗口句柄.HSHELL_LANGUAGE: 窗口的句柄.

HSHELL_REDRAW:被重画的窗口的句柄.HSHELL_WINDOWACTIVATED:被激活的窗口的句柄.

HSHELL_WINDOWCREATED:被创建的窗口的句柄.HSHELL_WINDOWDESTROYED:被销毁的窗口的句柄.

 

lParam:此参数的值依赖于参数nCode,其依赖关系如下所示:

HSHELL_GETMINRECT:指向该RECT结构的指针.HSHELL_LANGUAGE: 键盘布局的句柄.

HSHELL_REDRAW: 若该窗口正在闪现,则其值为TRUE,否则为FALSE.

HSHELL_WINDOWACTIVATED: 若该窗口是全屏模式,则其值为TRUE,否则为FALSE.返回值:返回值应为0.

 

备注:此挂钩处理过程通过调用函数SetWindowsHookEx ,指定WH_SHLL挂钩类型及其相应挂钩处理过程首地址来安装.

 

速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件,用户自定义.

 


LRESULT CALLBACK ShelProc( int nCode, WPARAM wParam, LPARAM lParam);
nCode:NT
可用的只有以下三个
HSHELL_ACTIVATESHELLWINDOW:
shell应当激活主窗体。
wParam=0
HSHELL_WINDOWCREATED:
顶级无主窗体被创建,当调用时窗体已存在。
wParam为窗体的handle  
HSHELL_DESTROYED:顶级无主窗体将要被销毁,调用时窗体仍存在。
lParam为窗体handle
返回值:0


 

SysMsgProc

函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用.当一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理之前,系统对此挂钩处理过程进行调用.此函数可以对系统中所有的对话框、消息框、菜单条、或滚动条消息进行监视.

类型HOOKPROC定义了指向此类回调函数的指针.SysMsgProc 是库中相应回调函数名的位置标志符.

函数原形:LRESULT CALLBACK SysMsgProc(int nCode,WPARAM wParam,LPARAM lParam);  

 

参数:

nCode:指示产生此消息的输入事件类型.此参数可以是以下值之一:

MSGF_DIALOGBOX:     输入事件由一个消息框或者对话框产生.

MSGF_MENU:         输入事件由一个菜单条产生.

MSGF_SCROLLBAR:       输入事件由一个滚动条产生.

MSGF_NEXTWINDOW:    输入事件由于用户摁下组合键以激活另一个窗口而产生.

若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数 CallNextHookEx 并返回其返回值.

wParam: 为NULL(0).

 

lParam: 指向MSG结构的[指针].

 

返回值:若nCode的值小于0,则此挂钩处理过程必须返回CallNextHookEx 的返回值.若nCode的值大于或等于0,并且此挂钩处理过程未对该消息进行处理,则调用函数CallNextHookEx 并返回其返回值是被推荐的.否则,其他安装了WH_SYSMSGFILTER挂钩的应用程序将无法收到此挂钩通知,并可能由此导致错误的行为.若此挂钩处理过程处理了此消息,它应返回一个非零值以避免系统再将此消息传送给目标窗口处理过程.

备注:一个应用程序通过调用函数SetWindowsHookEx 指定 WH_SYSMSGFILTER挂钩类型及相应挂钩处理过程首地址来安装此挂钩.

 

速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件,用户自定义.

 

UnhookWindowsHookEx

函数功能: 该函数将一个由SetWindowsHookEx 安装的挂钩处理过程从挂钩链中删除.

 

函数原形: BOOL UnhookWindowsHookEx(HHOOK hhk);

 

参数:

hhk: 被删除的挂钩的句柄.此参数是一个挂钩句柄,该句柄是此前函数SetWindowsHookEx的返回值.

 

返回值:该函数执行成功返回非0值,失败返回0.

 

备注:即使UnhookWindowsHookEx 函数返回之后,该钩子处理过程也可能正处于被其它线程调用的状态.若当前未调用该钩子处理过程,则在 UnhookWindowsHookEx 函数返回之前该钩子处理过程被立即删除.

 

DelHookProc:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数CallNextHookEx.

 

SetWindowsHook:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数SetWindowsHookEx.

 

UnhookWindowsHook:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数UnhookWindowsHookEx.

 

CallMsgFilter

函数功能:该函数将特定消息和挂钩代码发送给与挂钩 WH_SYSMSGFILTER和WH_MSGFILTER 相联系的挂钩处理过程,一个 WH_SYSMSGFILTER 或者 WH_MSGFILTER挂钩处理过程是指应用程序定义的回调函数,这些回调函数负责检查,并可有选择地修改关于对话框、消息框、菜单条、滚动条的消息。

 

函数原形:BOOL CallMsgFilter(LPMSG lpMsg, int nCode); 

 

参数:

lpMsg指向一个MSG结构,该结构包含发送给挂钩处理过程的消息.

 

nCode:指定挂钩处理过程需要使用的应用程序定义的代码,以确定如何对消息进行处理,该代码切忌采用与系统预定义的与WH_SYSMSGFILTER和WH_MSGFILTER挂钩相关的挂钩代码(MSGF_ 和 HC_开头)相同的值.

 

返回值:若该应用程序可对消息作进一步处理,则返回值为0,若该应用程序不能对该消息作进一步处理,则返回值为非0值.

 

备注:系统对CallMsgFilter进行调用,以使得应用程序能够检查和控制在对对话框、消息框、菜单条、滚动条的内部处理过程中产生的,或是由用户按下组合键以激活不同窗口时产生的消息流.

可通过调用函数SetWindowsHookEx来安装此挂钩处理过程.

速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:user32.lib,Unicode:在Windows NT上实现了Unicode和ANSI的版本.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值