http://blog.sina.com.cn/s/articlelist_1585708262_3_1.html
钩子(HOOK)函数教程(一)
我们可以首先从字面上了解钩子,钩子是干什么的呢?日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,Windows的钩子Hook也是用来钩东西的,比较抽象的是他是用来钩Windows事件或者消息的。最常见的就是鼠标和键盘钩子,用Hook钩子钩住鼠标、键盘,当你的鼠标、键盘有任何操作时,通过Hook就能知道他们都做了什么了,多么形象啊,把老鼠Mouse钩住了,不管你干什么,都逃不过我钩子Hook的手掌心。
哦,想起来了,金山词霸的屏幕取词是不是就是使用Hook实现的吧?
钩子(HOOK)函数教程(二)
比较专业的对钩子的技术性理解
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 zdwork.cn
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工作的,常常会看到很多人在论坛上长期争论一个话题:“全局钩子一定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。通过对上面各种钩子的作用域的理解就会发现这个问题的答案。 本文来自智动软件zdwork.cn
上面一共提到了15种钩子,他们的作用域请看下表:
Hook | Scope |
WH_CALLWNDPROC | Thread or global |
WH_CALLWNDPROCRET | Thread or global |
WH_CBT | Thread or global |
WH_DEBUG | Thread or global |
WH_FOREGROUNDIDLE | Thread or global |
WH_GETMESSAGE | Thread or global |
WH_JOURNALPLAYBACK | Global only |
WH_JOURNALRECORD | Global only |
WH_KEYBOARD | Thread or global |
WH_KEYBOARD_LL | Global only |
WH_MOUSE | Thread or global |
WH_MOUSE_LL | Global only |
WH_MSGFILTER | Thread or global |
WH_SHELL | Thread or global |
WH_SYSMSGFILTER | Global only |
表一:钩子作用域
WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER这5种钩子本身的作用域就是全局的,不管钩子是直接写在应用程序的代码里还是放在DLL中,他们都能够钩住系统的消息。剩下的10种钩子,他们的作用域既可以是线程的又可以是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来说,前面5种钩子本身就是全局的,是不需要注入的。
因此,对于前面问题的答案就是:要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的作用域。
如果对于同一事件既安装了线程勾子又安装了全局勾子,那么系统会自动先调用线程勾子,然后调用全局勾子。
钩子(HOOK)函数教程(三)
Hook Chain(钩子链表)
系统支持很多不同种类的钩子,每种类型提供对消息处理机制里的某一不同方面的访问。例如,应用程序可以使用WH_MOUSE Hook监视鼠标消息的传递。
系统为每类钩子维护着一个独立的钩子链表。钩子链表是一个指针的列表,其中的指针指向特定的、应用程序定义的回调函数,该函数被叫做钩子子程(hook procedure)。当与某种特定类型的钩子相关联(钩住)的消息发生时,系统将消息一个接一个地传递给钩子链中的每一个钩子子程(hook procedure),钩子子程能够采取的动作取决于涉及的钩子的类型。某些类型的钩子子程仅仅能监视消息;另外一些就能够修改消息或者终止消息在钩子链表中的前进,这样就阻止了消息到达下一个钩子子程或者目标窗体。
这里有几个概念上的翻译,主要有:
Hook Chain : 钩子链表
hook procedures : 钩子子程(即得到消息后进行处理的程序段)
钩子(HOOK)函数教程(四)
Hook Procedures (钩子子程)
为了利用某种特定类型的钩子,开发者提供了钩子子程。可以使用SetWindowsHookEx方法将该钩子子程安装到和该钩子相关联的钩子链表中。钩子子程必须具有下面的语法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam,
);
HookProc是应用程序定义的钩子处理程序的名字。
参数nCode:钩子代码,钩子子程通过该代码来决定执行什么动作。该值取决于钩子的类型,每种类型都拥有自己特有的钩子代码集合。
参数wParam和lParam的值,都取决于钩子代码。但是一般都包含发送或者传递的消息的信息。
方法SetWindowsHookEx总是在钩子链的开始位置安装钩子子程。当被某种类型的钩子监视的事件发生时,系统调用和该钩子相关的位于钩子链表开始位置的钩子子程。每个钩子链表中的钩子子程决定是否将该事件传递给下一个钩子子程。钩子子程通过调用方法CallNextHookEx向下一个钩子子程传递事件。
注意:某些类型的钩子子程仅仅能够监视消息,系统不管是否有特殊的钩子子程调用CallNextHookEx方法,都将把消息传递给每个钩子子程.
全局钩子监视同一桌面下所有做为调用线程的线程消息。线程钩子仅仅监视该单个线程的消息。全局钩子子程可以在所在桌面下任何应用程序的上下文中被调用,因此,该钩子子程序须在一个单独的动态链接库DLL中。
线程钩子的钩子子程只能在本线程的上下文中被调用。如果应用程序为他自己线程中的某个钩子安装钩子子程,钩子子程能够放在本模块中、应用程序代码的其它部分、Dll中。
如果应用程序为另外一个不同的应用程序安装钩子子程,钩子子程必须放在Dll中。
注意:只应为了调试目的而使用全局钩子;否则应避免使用。全局钩子会牺牲系统性能。使用了相同类型的全局钩子的应用程序之间也会有冲突.
钩子(HOOK)函数教程(五)
从现在开始,介绍全部钩子类型,一共有15种。
每种类型的钩子使应用程序能够监视系统的消息处理机制的不同方面。
钩子类型1-2:WH_CALLWNDPROC and WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC 和 WH_CALLWNDPROCRET钩子使你能够监视发送到window程序的消息。系统在将消息传递给正在接收的window程序之前,调用WH_CALLWNDPROC钩子子程;在window程序处理完消息之后,调用WH_CALLWNDPROCRET钩子子程。
WH_CALLWNDPROCRET钩子将一个指向CWPRETSTRUCT结构的的指针传递给钩子子程。该结构包含有来自处理该消息的window程序的返回值,以及消息中的参数。子类窗体不能处理进程间的消息集。
钩子类型3:WH_CBT Hook
在以下事件发生之前,系统会调用WH_CBT 钩子子程:
1、窗台被激活、创建、销毁、最小化、最大化、移动或者改变大小
2、执行完系统命令
3、从系统消息队列中移除鼠标或者键盘事件
4、设置输入焦点
5、同步系统消息队列
钩子子程的返回值决定了系统是允许了还是阻止了这些操作中的一个。
WH_CBT钩子主要是用在基于计算机的练习(CBT) 程序中。
钩子类型4:WH_DEBUG Hook
在调用与系统中任何其他钩子关联的钩子子程之前,系统会调用WH_DEBUG 钩子子程。使用该钩子来决定是否允许系统调用与其他类型的钩子相关联的钩子子程。
钩子类型5:WH_FOREGROUNDIDLE Hook
WH_FOREGROUNDIDLE 钩子允许当前台线程空闲时,执行低权限的任务。系统在应用程序的前台线程即将空闲时,调用WH_FOREGROUNDIDLE钩子子程。
钩子类型6:WH_GETMESSAGE Hook
WH_GETMESSAGE程序允许应用程序监视即将由方法GetMessage 或者PeekMessage返回的消息。可以使用WH_GETMESSAGE钩子监视鼠标和键盘输入,以及其他传递给消息队列的消息
钩子(HOOK)函数教程(六)
钩子类型7:WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK钩子允许应用程序将消息插入到系统消息队列中。使用该钩子回放先前使用WH_JOURNALRECORD 钩子记录的一系列鼠标和键盘事件。在WH_JOURNALPLAYBACK被安装后,常规的鼠标和键盘输入被禁用。WH_JOURNALPLAYBACK钩子是全局钩子,不能被用作线程钩子。WH_JOURNALPLAYBACK钩子返回一个超时值。该值告诉系统在处理来自回放钩子的当前消息之前等待了多少毫秒。这允许该钩子控制回放事件的速度。
钩子类型8:WH_JOURNALRECORD Hook
WH_JOURNALRECORD钩子允许监视并且记录输入事件。典型的,使用该钩子来记录顺序的的鼠标和键盘事件,以后可以使用WH_JOURNALPLAYBACK.钩子进行回放。 该钩子是全局钩子,不能被用作进程钩子。
钩子类型9:WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL钩子监视在线程输入队列中,即将被传递的键盘输入事件。
钩子类型10:WH_KEYBOARD Hook
WH_KEYBOARD钩子允许应用程序监视即将被GetMessage 或者 PeekMessage方法返回的WM_KEYDOWN 或者 WM_KEYUP消息。使用WH_KEYBOARD钩子可以监视传递到消息队列中的键盘输入。
钩子类型11:WH_MOUSE_LL Hook
WH_MOUSE_LL钩子监视在线程输入队列中,即将被传递的鼠标输入事件。
钩子类型12:WH_MOUSE Hook
WH_MOUSE钩子允许监视即将被GetMessage或者 PeekMessage方法返回的鼠标消息。使用该钩子监视传递到线程输入队列的鼠标输入.
钩子(HOOK)函数教程(七)
认识完各种钩子类型之后,接下来了解和钩子如影随形的钩子子程,即相应的回调函数。钩子(HOOK)函数教程(八)
方法1:CallMsgFilter
CallMsgFilter方法传递特定的消息和钩子代码到与WH_SYSMSGFILTER 和 WH_MSGFILTER钩子相关联的钩子子程。
WH_SYSMSGFILTER或者 WH_MSGFILTER钩子子程是应用程序定义的回调函数,该回调函数用来检验、选择、修改传递给对话框、消息框、菜单或者滚动条的消息.
BOOL CallMsgFilter( LPMSG lpMsg, int nCode);
参数说明 :
lpMsg :指向MSG结构的指针,该结构包含有即将传递给钩子子程的消息。
nCode :指定应用程序定义的代码,钩子子程使用该代码来决定如何处理消息。
该代码不能与系统定义的与WH_SYSMSGFILTER 和 WH_MSGFILTER钩子相关的钩子代码 (MSGF_ and HC_)相同。
Return Value:如果应用程序应该进一步处理该消息,返回值为0;如果不处理,返回非0值。
Remarks: 系统调用CallMsgFilter方法来允许应用程序检查、控制在对话框、消息框、菜单、滚动条内部处理中的消息的流动,或者当用户通过按下ALT+TAB组合键激活不同的窗口时的信息流动。
通过SetWindowsHookEx方法来安装该钩子子程。
方法2 :CallNextHookEx
CallNextHookEx方法将钩子信息传递给当前钩子链表中的下一个钩子子程。
钩子子程能够在处理钩子信息之前或者之后调用该方法。
LRESULT CallNextHookEx( HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam);
参数:
hhk :Ignored.
nCode :制定传递给当前Hook处理函数的hook码,下一个Hook处理函数使用该Code来决定如何处理Hook信息。
wParam / lParam :这两个参数分别指定传递给当前钩子子程的wParam / lParam值。参数的意义取决于与当前钩子链表相关联的钩子类型。
返回值:该值由钩子链表中的下一个钩子子程返回。当前钩子子程也必须返回该值。返回值的意义取决于钩子类型。
注意:
钩子子程为了特定的钩子类型而被安装。CallNextHookEx方法调用钩子链表中的下一个钩子。调用CallNextHookEx是可选的,但是强烈要求调用该函数;否则,其他已经安装有钩子的应用程序将收不到钩子通知,从而可能导致不正确的行为。除非绝对需要阻止通知被其他应用程序看到,其它情况下都应该调用CallNextHookEx方法
钩子(HOOK)函数教程(九)
方法3 :CallWndProc
CallWndProc钩子子程是与SetWindowsHookEx一起使用的、用户定义的或者库定义的回调函数。
HOOKPROC类型定义了指向该回调函数的指针。
CallWndProc是程序定义的或者库定义的方法名字。
语法:LRESULT CALLBACK CallWndProc(Int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode:指定钩子子程是否必须处理该消息。
如果nCode是HC_ACTION,钩子子程就必须处理该消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx,自己不对消息进行进一步的处理,必须返回由CallNextHookEx 方法返回的返回值。
wParam :指定消息是否由当前线程发出。如果消息是由当前线程发出的,该值就是非0;否则,就是0。
lParam :指向CWPSTRUCT结构的指针,该结构含有消息的细节信息。
返回值:如果nCode小于0,钩子子程必须返回由CallNextHookE方法返回的返回值。
如果nCode大于等于0,强烈要求调用CallNextHookEx方法,并返回由它返回的返回值;否则,其他已经安装了WH_CALLWNDPROC钩子的应用程序将收不到钩子通知,可能导致行为的错误。
如果钩子子程没有调用CallNextHookEx方法,返回值应该为 0。
备注:CallWndProc钩子子程能够检查消息,但是不能修改消息。当钩子子程将控制权交还给系统之后,消息被传递给窗体程序。
应用程序这样安装钩子子程:指定WH_CALLWNDPROC钩子类型,指定一个指向调用SetWindowsHookEx方法的钩子子程的指针。
方法4 :CallWndRetProc
CallWndRetProc钩子子程是与SetWindowsHookEx一起使用的、用户定义的或者库定义的回调函数。
在SendMessage方法被调用之后,系统调用CallWndRetProc方法。
钩子子程能够检查、但是不能修改消息。
HOOKPROC类型定义了指向该回调函数的指针。
CallWndRetProc是程序定义的或者库定义的方法名字。
语法:
LRESULT CALLBACK CallWndRetProc(int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode :指定钩子子程是否必须处理消息。
如果nCode是HC_ACTION,钩子子程必须处理该消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx方法,自己不对消息进行进一步的处理,必须返回由CallNextHookEx 方法返回的返回值。
wParam :指定消息是否由当前进程发出。如果消息是由当前进程发出的,wParam为非0;否则,为NULL。
lParam :指向CWPSTRUCT结构的指针,该结构含有消息的细节信息。
返回值:如果nCode小于0,钩子子程必须返回由CallNextHookE返回的返回值。
如果nCode大于等于0,强烈要求调用CallNextHookEx方法,并返回由它返回的返回值;否则,其他已经安装了WH_ CALLWNDPROCRET钩子的程序将收不到钩子通知,可能导致行为的错误。
如果钩子子程没有调用CallNextHookEx方法,返回值应该为0。
备注:应用程序这样安装钩子子程:指定WH_ CALLWNDPROCRET钩子类型,指定一个指向调用SetWindowsHookEx方法的钩子子程的指针
方法5:CBTProc钩子(HOOK)函数教程(十)
CBTProc钩子子程是和SetWindowsHookEx方法同时使用的、程序定义的或者库定义的回调函数。
系统在下列事件发生之前调用该方法:
激活、创建、销毁、最小化、最大化、移动窗体、改变窗体大小
完成系统命令
从系统消息队列中移除鼠标或者键盘事件
设置键盘焦点
同步系统消息队列。
CBT应用程序使用该钩子子程接收来自系统的有用的通知。
HOOKPROC类型定义了指向该回调函数的指针。
CBTProc是程序定义的或者库定义的方法名字。
LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode:指定一个码值,钩子子程使用该值来决定如何处理消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx方法,自己不对消息做进一步的处理,并且应该返回由CallNextHookEx方法返回的返回值。
该参数可以是以下值中的一个:
1.HCBT_ACTIVATE :系统即将创建一个窗体。
2.HCBT_CLICKSKIPPED :系统已经将一个鼠标消息从系统消息队列中移除。一旦收到该钩子代码,CBT应用程序必须安装一个WH_JOURNALPLAYBAC钩子子程来响应鼠标消息。
3.HCBT_CREATEWND :窗体即将被创建。系统在向窗体发出WM_CREATE 或者 WM_NCCREATE消息之前,调用该钩子子程。
如果钩子子程返回非0值,表示系统销毁了窗体;CreateWindow方法返回Null,但是WM_DESTROY消息并不发送给窗体。如果钩子子程返回0,表示窗体正常被创建。
在 HCBT_CREATEWND通知的时候,窗体已经被创建了,但是它的最终的大小和位置可能还没有被确定,它的父窗体也可能没有被创建起来。
虽然一个新创建的窗体可能还没有接收到WM_NCCREATE或者WM_CREATE消息,但是向它发送消息是可能的。
通过修改CBT_CREATEWND 结构体的hwndInsertAfter成员,改变新创建窗体的在Z轴次序的位置也是可能的。
4.HCBT_DESTROYWND :窗体即将被销毁。
5.HCBT_KEYSKIPPED :系统已经从系统的消息队列中移除了一个键盘消息。一旦接收到该钩子代码,CBT应用程序必须安装一个WH_JOURNALPLAYBAC钩子来响应键盘消息。
6.HCBT_MINMAX :窗体即将被最小化或者最大化。
7.HCBT_MOVESIZE :窗体即将被移动或者重置大小。
8.HCBT_QS :系统已经收到了一个来自系统消息队列的WM_QUEUESYNC消息。
9.HCBT_SETFOCUS :窗体即将接收键盘焦点。
10.HCBT_SYSCOMMAND :系统命令即将被执行。这允许CBT程序阻止通过快捷键来进行任务切换。
wParam :取决于参数
lParam :取决于参数
返回值:钩子子程的返回值取决于系统允许还是阻止这种操作。
1、对于下列这些操作的CBT钩子代码,如果允许则返回值必须是0,如果阻止返回值必须是1。
HCBT_ACTIVATE ;HCBT_CREATEWND ;HCBT_DESTROYWND ;HCBT_MINMAX ;HCBT_MOVESIZE ;HCBT_SETFOCUS ;HCBT_SYSCOMMAND
2、对于下列这些操作的CBT钩子代码,返回值被忽略。
HCBT_CLICKSKIPPED ;HCBT_KEYSKIPPED ;HCBT_QS
钩子(HOOK)函数教程(十一)
方法6 : DebugProc
DebugProc钩子子程是和SetWindowsHookEx方法一起使用的、程序定义的或者库定义的回调函数。
系统在调用和任何类型钩子相关联的钩子子程之前调用该方法。
系统将即将被调用的钩子的信息传递给DebugProc钩子子程,DebugProc钩子子程检查该信息,决定是否允许该钩子被调用。
HOOKPROC类型定义了指向该回调函数的指针。
DebugProc是程序定义的或者库定义的方法名字。
LRESULT CALLBACK DebugProc(int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode :指定钩子子程是否必须处理该消息。
如果nCode是HC_ACTION,钩子子程就必须处理该消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx方法,自己对消息不做进一步处理,并且应该返回由CallNextHookEx方法返回的返回值。
wParam :指定即将被调用的钩子类型。参数可以是下列之一:
1.WH_CALLWNDPROC :安装一个钩子子程来监视发送给窗口过程的消息。
2.WH_CALLWNDPROCRET :安装一个钩子子程来监视刚刚被窗口过程处理完的消息。
3.WH_CBT :安装一个钩子子程来接收对CBT应用程序有用的通知。
4.WH_DEBUG :安装一个有用的钩子子程来调试其他钩子子程。
5.WH_GETMESSAGE :安装一个钩子子程来监视传递给消息队列的消息。
6.WH_JOURNALPLAYBACK :安装一个钩子子程来发送先前使用WH_JOURNALRECORD钩子子程记录的消息。
7.WH_JOURNALRECORD :安装一个钩子子程来记录传递给系统消息队列的输入消息。该钩子用来记录宏很有用。
8.WH_KEYBOARD :安装一个钩子子程来监视键盘敲击消息。
9.WH_MOUSE :安装一个钩子子程来监视鼠标消息。
10.WH_MSGFILTER :安装一个钩子子程来监视下列输入事件的结果消息:对话框、消息框、菜单、滚动条。该钩子子程仅仅为安装该钩子子程的应用程序监视这些消息。
11.WH_SHELL :安装一个钩子子程来接收对Shell类应用程序有用的通知。
12.WH_SYSMSGFILTER :安装一个钩子子程来监视下列输入事件的结果消息:对话框,消息框,菜单,滚动条。该钩子子程为系统中所有的应用程序监视这些消息。
lParam:指向DEBUGHOOKINFO结构的指针,该结构中含有传递给目标钩子子程的参数。
返回值:为了阻止系统调用后续钩子处理函数,钩子子程必须返回一个非0值。否则,钩子子程必须调用CallNextHookEx方法。
备注:应用程序通过下面方式安装该钩子子程:指定WH_DEBUG钩子类型;在调用SetWindowsHookEx方法的函数中指向钩子子程的指针。
钩子(HOOK)函数教程(十二)
方法7 : ForegroundIdleProc
ForegroundIdleProc钩子子程是和SetWindowsHookEx方法一起使用的、程序定义的或者库定义的回调函数。
当前台线程即将变成空闲时,系统将调用该方法。
HOOKPROC类型定义了指向该回调函数的指针。
ForegroundIdleProc是程序定义的或者库定义的方法名字。
DWORD CALLBACK ForegroundIdleProc(int code, DWORD wParam,LONG lParam);
参数:
code :指定钩子子程是否必须处理消息。
如果nCode是HC_ACTION,钩子子程就必须处理该消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx方法,自己对消息不做进一步处理,并且应该返回由CallNextHookEx方法返回的返回值。
wParam :未使用
lParam :未使用
返回值: 如果nCode小于0,钩子子程必须返回由CallNextHookEx返回的返回值。
如果nCode大于等于0,强烈要求调用CallNextHookEx方法,并返回由它返回的返回值;否则,其他已经安装了WH_ CALLWNDPROCRET钩子的程序将收不到钩子通知,可能导致行为的错误。
如果钩子子程没有调用CallNextHookEx方法,返回值应该是0。
备注: 应用程序通过下面方式安装该钩子子程:指定WH_ FOREGROUNDIDLE钩子类型;在调用SetWindowsHookEx方法的函数中指向钩子子程的指针
钩子(HOOK)函数教程(十三)
方法8 : GetMsgProc
GetMsgProc是和SetWindowsHookEx方法一起使用的、程序定义的或者库定义的回调函数。
无论什么时候,当GetMessage 或者 PeekMessage方法接收到来自应用程序消息队列的消息时,系统都会调用该方法。
在将收到的消息返回给调用者之前,系统将消息传递给钩子子程。
HOOKPROC类型定义了指向该回调函数的指针。
GetMsgProc是程序定义的或者库定义的方法名字。
LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam);
参数:
code:指定钩子子程是否必须处理消息。
如果nCode是HC_ACTION,钩子子程就必须处理该消息。
如果nCode小于0,钩子子程就必须将该消息传递给CallNextHookEx方法,自己对消息不做进一步处理,并且应该返回由CallNextHookEx方法返回的返回值。
wParam:指定消息是否已经被从队列中移除了。
该参数可以是下列值中的一个:
1.PM_NOREMOVE:指定消息尚未从队列中移出。(应用程序在调用该方法的同时指定PM_NOREMOVE标志)
2.PM_REMOVE: 指定消息已经被从队列中移除了。(程序调用GetMessage 或者PeekMessage方法的同时指定PM_REMOVE标志)
lParam :指向MSG结构的指针,结构中包含和消息相关的细节。
返回值:
如果参数code小于0,钩子子程必须返回由CallNextHookEx返回的返回值。
如果参数code大于等于0,强烈要求调用CallNextHookEx方法,并返回由该方法返回的返回值;否则,其他已经安装了WH_GETMESSAGE钩子的程序将收不到钩子通知,可能导致行为的错误。
如果钩子子程没有调用CallNextHookEx方法,返回值应该是
备注:GetMsgProc钩子子程能够检查或者修改消息。
在钩子子程将控制权交还给系统之后,GetMessage 或者PeekMessage方法将该消息以及任何修改都一起返回给最初调用它的应用程序。
应用程序通过下面方式安装该钩子子程:指定WH_ GETMESSAGE钩子类型;指定在调用SetWindowsHookEx方法的函数中指向钩子子程的指针。
钩子(HOOK)函数教程(十四)
方法9 :JournalPlaybackProc
JournalPlaybackProc钩子子程是和SetWindowsHookEx方法一起使用的、程序定义的或者库定义的回调函数。
典型的,应用程序使用该方法回放前期由JournalRecordProc钩子子程记录下来的一系列鼠标和键盘消息。
只要JournalPlaybackProc钩子子程被安装,常规的鼠标和键盘输入将被禁用。
HOOKPROC类型定义了指向该回调函数的指针。
JournalPlaybackProc 是程序定义的或者库定义的方法名字。
LRESULT CALLBACK JournalPlaybackProc(int code,WPARAM wParam,LPARAM lParam);
参数:
code :指定钩子子程使用的代码,以决定如何处理该消息。
如果参数code小于0,钩子子程不对其进行任何进一步的处理,必须将消息传递给CallNextHookEx方法,返回由CallNextHookEx方法返回的返回值。
该参数可以是下列值之一:
1.HC_GETNEXT :钩子子程必须将当前鼠标或者键盘消息拷贝给由参数lParam指向的EVENTMSG结构。
2.HC_NOREMOVE :应用程序已经调用带有指向PM_NOREMOVE的 wRemoveMsg 集合的PeekMessage方法,指示该消息在PeekMessage处理完毕后,没有从消息队列中移除。
3.HC_SKIP :钩子子程必须准备拷贝下一个鼠标或者键盘消息到由lParam 指向的 EVENTMSG结构。一旦接收到HC_GETNEXT代码,钩子子程必须将消息拷贝到结构体中。
4.HC_SYSMODALOFF :系统模态的对话框已经被销毁。钩子子程应该恢复回放消息。
5.HC_SYSMODALON :系统模态的对话框正在被显示。直到对话框被销毁,钩子子程应该停止返回消息。
wParam :该参数未使用。
lParam :指向EVENTMSG结构的指针,该结构代表正在被钩子子程处理的消息。只有当参数code是HC_GETNEXT时该参数才有效。
返回值:
为了使系统在处理消息之前等待,该返回值应该是系统应该等待的时间数量,该值以时钟嘀嗒为单位(该值可以通过当前和前一个输入消息的time成员的差值来计算)。
为了快速的处理该消息,返回值应该是0。
只有当钩子代码是HC_GETNEXT时,返回值才有意义;否则,该参数被忽略。
备注:
JournalPlaybackProc钩子子程应该拷贝一个输入消息到lparm参数。
消息必须在先前已经使用JournalRecordProc钩子子程被记录了下来,JournalRecordProc钩子子程不应修改消息。
为了一遍又一遍的得到同样的消息,钩子子程在将code参数设置为HC_GETNEXT,而不是HC_SKIP的情况下,可以被调用多次。
如果参数code 是 HC_GETNEXT,而且返回值大于0,系统将休眠,休眠时间是返回值指定的毫秒数。当系统继续的时候,将参数设置为HC_GETNEXT并调用钩子子程来重新得到同一个的消息。新的JournalPlaybackProc调用的返回值应该是0;否则,系统将回到休眠状态,休眠时间是返回值指定的毫秒数,休眠过后再次调用JournalPlaybackProc,以此类推。
系统看起来像没有响应一样。
和其他全局的钩子子程不一样,JournalRecordProc 和JournalPlaybackProc钩子子程永远在设置该钩子的线程的上下文中被调用。
在钩子子程将控制权交还给系统之后,消息继续被处理。如果code是HC_SKIP ,钩子子程必须在下一次被调用时返回下一条记录的事件消息。
通过指定WH_JOURNALPLAYBACK钩子类型,以及一个钩子子程的指针(该子程在SetWindowsHookEx方法中被调用)来安装JournalPlaybackProc钩子子程。
在钩子函数处理过程中,如果用户按下了 CTRL+ESC 或者 CTRL+ALT+DEL组合键,系统将停止钩子处理函数,卸载回放钩子子程,传递一个WM_CANCELJOURNAL消息给应用程序。
如果钩子子程返回一个在WM_KEYFIRST到WM_KEYLAST范围内的消息,EVENTMSG结构的paramL成员指定被按下键的虚拟键码。EVENTMSG结构的paramH成员指定扫描码。
没有办法指定重复的计数。事件总是趋于代表一个键事件
钩子(HOOK)函数教程(十五)
方法10 : JournalRecordProc
JournalRecordProc钩子子程是与SetWindowsHookEx一起使用的、程序定义的或者库定义的回调函数。
该方法记录系统从系统消息队列中移除的消息。过后,应用程序可以使用JournalPlaybackProc钩子子程回放这些消息。
HOOKPROC类型定义了指向该回调函数的指针。JournalRecordProc是程序定义的或者库定义的方法名字。
LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);
参数:
code:
指定如何处理消息。如果code小于0,钩子子程不对其进行任何进一步的处理,必须将消息传递给CallNextHookEx方法,并返回由CallNextHookEx方法返回的返回值。
该参数可以是以下值之一:
1.HC_ACTION : 参数lParam 是一个指向EVENTMSG结构的指针,该结构包含从系统队列中移除的消息的信息。钩子子程应该通过将消息信息拷贝到缓冲区中或者文件中来记录内容。
2.HC_SYSMODALOFF :系统模态对话框已经被销毁。钩子子程必须恢复纪录。
3.HC_SYSMODALON :A system-modal dialog box is being displayed. Until the dialog box is destroyed, the hook procedure must stop recording. 系统模态对话框正在被显示。直到对话框被销毁,钩子处理函数都应该停止记录。
wParam: 该参数未使用。
lParam :指向EVENTMSG结构的指针,其中包含即将被记录的消息。
返回值:返回值会被忽略。
备注:
JournalRecordProc钩子处理函数只能复制而不能修改消息。在钩子子程将控制权交还给系统后,消息将被继续处理。
通过下面方式安装该钩子子程:指定WH_JOURNALRECORD钩子类型;指定在调用SetWindowsHookEx方法的函数中指向钩子子程的指针。
JournalRecordProc钩子处理函数没必要在动态链接库中实现,在应用程序中实现即可。
和其它全局钩子子程不一样,JournalRecordProca和 JournalPlaybackProc钩子子程总是在设置钩子的线程的上下文中被调用。
安装有JournalRecordProc钩子处理函数的应用程序应该监视VK_CANCEL虚拟键码(在多数键盘上就是像CTRL+BREAK一样实现的组合键)。虚拟键值应该被应用程序解释为用户希望停止记录。应用程序应该通过结束记录队列并且移除JournalRecordProc钩子处理函数来响应用户的请求。移除是非常重要的,因为这可以防止该应用程序由于钩子处理函数内部的挂起而引起的系统锁死。
CTRL+BREAK组合键扮演着停止记录的信号的角色,也就是说CTRL+BREAK组合键不能被记录。因为CTRL+C组合键没有扮演这样的角色,它就可以被记录。还有其它2种组合键不能被记录: CTRL+ESC 和 CTRL+ALT+DEL。这2种组合键引起系统停止所有日志活动(记录或者回放),移除所有日志钩子,传递WM_CANCELJOURNAL消息给日志记录应用程序
钩子(HOOK)函数教程(十六)
方法11 : KeyboardProc
KeyboardProc钩子子程是同SetWindowsHookEx方法一起使用的、用户定义的或者库定义的回调函数。无论什么时候,当应用程序调用GetMessage 或者 PeekMessage方法,或者有一个键盘消息(WM_KEYUP或者 WM_KEYDOWN)时,系统都会调用该钩子处理函数。
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
参数:
code:
指定钩子子程使用的代码,来决定如何处理该消息。
如果code小于0,钩子子程必须将该消息传递给CallNextHookEx方法,自己不进行任何进一步的处理,并且返回由CallNextHookEx方法返回的返回值。
该参数可以是以下值之一:
1.HC_ACTION :参数 wParam 和 lParam 包含有键盘敲击消息的信息。
2.HC_NOREMOVE :参数wParam和lParam包含有键盘敲击消息的信息,键盘敲击消息还没有被从消息队列中移除。(应用程序调用PeekMessage方法,同时指定PM_NOREMOVE标志。)
wParam :指定生成键盘敲击消息的键的虚拟键码值。
lParam :指定重复次数,扫描代码,扩展键标志,上下文代码,前期的键状态标志,转换状态标志。
该参数可下列的一个或者多个值
0-15 : Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key. 指定重复的次数。该值是键盘敲击被重复的次数,当用户持续按住一个键时。
16-23 :指定扫描代码。该值依赖于OEM。
24 :指定该值是否是一个扩展键,例如功能键或者数字键盘上的键。如果是扩展键,该值为1,否则为0。
25-28 : 保留
29 :指定上下文代码。如果ALT键被按下,该值为1,否则为0。
30 : 指定之前的键状态。如果在消息发出之前该键被按下,值为1;如果键弹起,值为0。
31 : 指定转换状态。如果键正在被按下,该值为0,如果正在被释放,则为1。
返回值:
如果code小于0,钩子子程必须返回由CallNextHookEx返回的返回值。如果code大于等于0,并且钩子子程也没有处理该消息,强烈要求调用CallNextHookEx方法,并返回它的返回值;否则,其它安装有WH_KEYBOARD钩子的应用程序将收不到钩子通知,可能导致行为的错误。如果钩子子程处理了该消息,可能返回一个非0值,用来阻止系统将该消息传递给钩子链表中的其它钩子或者目的窗体程序。
备注:
应用程序通过下面的方法安装该钩子子程: 指定WH_KEYBOARD钩子类型;指定在调用SetWindowsHookEx的方法中的一个指向钩子子程的指针。
钩子(HOOK)函数教程(十七)
方法12 : LowLevelKeyboardProc
每次有新的键盘输入事件要被传递给一个线程输入队列时,系统会调用该方法。
键盘输入可以来自本地键盘驱动,也可以来自对keybd_event事件的调用。
如果输入来自对keybd_event事件的调用,那么输入是被“注入”的。
然而,WH_KEYBOARD_LL钩子不被注入到其它进程中,相反上下文会切换回安装钩子的进程,该钩子就会在原始的上下文中被调用,然后,上下文切换回生成该事件的应用程序中。
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam );
参数:
nCode :指定钩子子程使用的代码,钩子子程使用该值决定如何处理消息。
如果nCode小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不做进一步的处理,并且要返回由方法CallNextHookEx返回的的返回值。
该参数可以是下列值之一
1.HC_ACTION :参数wParam和lParam包含有和键盘消息相关的信息。
wParam :指定键盘消息的标识符。该参数可以是以下参数之一: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.
lParam :指向KBDLLHOOKSTRUCT结构的指针。
返回值:
如果nCode小于0,钩子子程必须返回由方法CallNextHookEx返回的返回值。如果nCode大于等于0,并且钩子子程还没有处理消息,强烈建议调用CallNextHookEx方法,返回由它返回的返回值;否则,其它已经安装了WH_KEYBOARD_LL 钩子的应用程序将接收不到钩子通知,可能导致行为的错误。如果钩子子程已经处理了该消息,就返回一个非0值来阻止系统将消息传递给钩子链表中的其他钩子,或者目的窗体程序。
备注:
应用程序通过下面的方法安装钩子子程:指定WH_KEYBOARD_LL钩子类型;指定在调用SetWindowsHookEx的方法中的指向钩子子程的指针
钩子在安装它的线程的上下文中被调用。通过发送消息给安装该钩子的线程来实现调用。因此,安装有该钩子的线程必须有消息循环。
钩子处理函数应该用比下面时间少的时间来处理消息:在注册表的HKEY_CURRENT_USER\Control Panel\Desktop键的 LowLevelHooksTimeout值指定的时间,该值是以毫秒为单位的。
如果钩子处理函数在这个间隔内没有返回,系统将把消息传递给下一个钩子。
注意:调试钩子不能跟踪该类型的钩子。
钩子(HOOK)函数教程(十八)
方法13 : LowLevelMouseProc
系统在每次有新的鼠标输入事件即将被传递给线程输入队列时,调用该方法。
鼠标输入可以来自本地鼠标驱动或者对mouse_event方法的调用。
如果输入来自对mouse_event的调用,该输入就是被“注入”。
因为WH_MOUSE_LL钩子不能被注入到其他进程。所以上下文会切换回安装该钩子的进程,该钩子会在原始的上下文中被调用。
然后,上下文切换回生成该事件的应用程序中。
LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam );
参数:
nCode :指定钩子子程如何处理该消息。
如果nCode小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不进行进一步的处理,并且应该返回由方法CallNextHookEx返回的返回值。
参数可以是下列值之一:
1.HC_ACTION :wParam 和 lParam 参数包含有鼠标消息的信息。
wParam :指定鼠标消息的标识符。参数可以是以下消息之一: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP.
lParam :指向MSLLHOOKSTRUCT结构的指针。
返回值:如果nCode小于0,钩子子程必须返回由方法CallNextHookEx返回的返回值。
如果nCode大于等于0,而且钩子子程没有处理该消息,那么强烈要求调用方法CallNextHookEx并返回由它返回的返回值;否则,其它已经安装了WH_MOUSE_LL钩子的应用程序将收不到钩子通知,可能导致行为的错误。如果钩子子程已经处理了该消息,应该返回一个非0值,用来阻止系统将消息传递给钩子链表中的其它钩子或者目标窗体程序。
备注:
该钩子在安装它的线程的上下文中被调用。通过发送消息给安装钩子的线程来实现调用。因此,安装钩子的线程必须有消息循环。
钩子子程应该用比下面时间少的时间来处理消息: 在注册表的HKEY_CURRENT_USER\Control Panel\Desktop键的 LowLevelHooksTimeout值指定的时间(该值是以毫秒为单位的)。
如果钩子子程在这个间隔没有返回,系统将把消息传递给下一个钩子。
注意:调试钩子不能追踪该类型的钩子
钩子(HOOK)函数教程(十九)
方法14 :MessageProc
在对话框,消息框,菜单,滚动条的输入事件发生后、在这些输入事件生成的消息被处理之前,系统会调用该方法。
钩子子程可以监视特定的程序或者所有程序生成的对话框,消息框,菜单或者滚动条的消息。
LRESULT CALLBACK MessageProc(int code, WPARAM wParam,LPARAM lParam );
参数:
指定生成消息的输入事件的类型。
如果code小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不进行任何进一步处理,并且要返回由方法CallNextHookEx返回的返回值。
该参数可以时下列方法之一:
1.MSGF_DDEMGR :当DDEML(Dynamic Data Exchange Management Library)正在等待同步传输结束时,该输入事件发生。
2.MSGF_DIALOGBOX :输入事件在消息框或者对话框中发生。
3.MSGF_MENU :The input event occurred in a menu. 输入事件在菜单中发生。
4.MSGF_SCROLLBAR :输入事件在滚动条中发生。
wParam: 该参数未被使用。
lParam :指向MSG结构的指针。
返回值:
如果code小于0,钩子子程必须返回由方法CallNextHookEx返回的返回值。
如果code大于等于0,而且钩子子程还没有处理该消息,强烈要求调用CallNextHookEx方法并返回由它返回的返回值;否则,其它已经安装了WH_MSGFILTER钩子的应用程序将收不到钩子通知,可能导致行为的错误。如果钩子子程已经处理了该消息,应该返回非0值,以阻止系统将消息传递给钩子链表中剩下的钩子或者目标窗口子程。
备注:
使用DDEML、执行同步传递的应用程序必须在消息被分发前进行处理,并且必须使用WH_MSGFILTER钩子
钩子(HOOK)函数教程(二十)
方法15 :MouseProc
无论什么时候,当应用程序一调用GetMessage 或者 PeekMessage方法,并且鼠标消息即将被处理时,系统就调用该方法。
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode :指定钩子子程使用的用来决定如何处理消息的码值。
如果nCode小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不进行进一步的处理,并且要返回由CallNextHookEx方法返回的返回值。
该参数可以是下列值之一:
1.HC_ACTION :参数wParam 和 lParam包含和鼠标消息相关的信息。
2.HC_NOREMOVE :参数wParam 和 lParam包含和鼠标消息相关的信息,并且鼠标消息还没有从消息队列中移除(应用程序调用PeekMessage时,制定PM_NOREMOVE标志位)。
wParam :指定鼠标消息的标识符。
lParam:指向MOUSEHOOKSTRUCT结构的指针。
返回值:
如果code小于0,钩子子程必须返回由CallNextHookEx方法返回的返回值。
如果code大于等于0,并且钩子子程没有处理该消息,强烈要求调用CallNextHookEx方法并返回由它返回的返回值;
否则,其它已经安装了WH_MOUSE钩子的应用程序将收不到钩子通知,可能导致行为的错误。
如果钩子子程已经处理了该消息,应该返回非0值,以阻止系统将消息传递给钩子链表中剩余的钩子或者目标窗体程序。
备注:
该钩子处理函数 禁止 安装在WH_JOURNALPLAYBACK钩子的回调函数中
钩子(HOOK)函数教程(二十一)
方法16 :SetWindowsHookEx
SetWindowsHookEx方法安装一个应用程序定义的钩子处理函数到钩子链表中。你可以安装钩子处理函数来监视系统的一些类型的事件。这些事件与线程绑定:某个特定的线程或者与调用线程处于同一桌面下的所有线程。
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);
参数:
idHook :指定即将被安装的钩子处理函数的类型。该参数可以是下列值之一:
1.WH_CALLWNDPROC :安装一个钩子处理函数,用来在系统将消息发送给目的窗体程序之前监视消息。
2.WH_CALLWNDPROCRET :安装一个钩子处理函数,用来在消息被目标窗体程序处理之后来监视消息。
3.WH_CBT :安装一个钩子处理函数,用来接收对CBT程序有用的通知。
4.WH_DEBUG :安装一个用于调试其它钩子处理函数的钩子处理函数。
5.WH_FOREGROUNDIDLE :安装一个钩子处理函数,当应用程序的前台线程即将空闲时,该处理函数被调用。该钩子类型对于在应用程序空闲时间处理低优先级别的任务非常有用。
5.WH_GETMESSAGE :安装一个钩子处理函数用来监视投递给消息队列的消息。
6.WH_JOURNALPLAYBACK :安装一个钩子处理函数用来投递之前由WH_JOURNALRECORD钩子处理函数记录的消息。
7.WH_JOURNALRECORD :安装一个钩子处理函数来记录投递给系统消息队列的输入消息。该钩子对记录宏很有用。
8.WH_KEYBOARD :安装一个钩子处理函数用来监视键盘消息。
9.WH_KEYBOARD_LL :在Windows NT/2000/XP环境下:安装一个钩子处理函数用来监视低层键盘输入事件。
10.WH_MOUSE :安装一个钩子处理函数用来监视鼠标消息。
11.WH_MOUSE_LL :在 Windows NT/2000/XP环境下,安装一个钩子处理函数用来监视低层鼠标输入事件。
12.WH_MSGFILTER :安装一个钩子处理函数用来监视下列对象的输入事件产生的消息:对话框、消息框、菜单、滚动条。
13.WH_SHELL :安装一个钩子处理函数用来接收Shell程序相关的通知。
14.WH_SYSMSGFILTER :安装一个钩子处理函数用来监视下列对象的输入事件产生的消息:对话框、消息框、菜单、滚动条。钩子处理函数监视与调用线程处于同一桌面下的所有应用程序。
lpfn :指向钩子处理函数的指针。如果参数dwThreadId为0或者指定由不同进程创建的线程的ID,那么lpfn参数必须指向动态链接库里的钩子处理函数。
否则,lpfn可以指向当前进程中的钩子处理函数。
hMod :DLL的句柄,其中包含由lpfn参数指向的钩子处理函数。
如果参数dwThreadId指定的线程属于当前的进程,并且购置处理函数业主当前的进程,hMod参数必须设置为Null。
dwThreadId :指定钩子处理函数要监视的线程ID。
如果该参数是0,钩子处理函数监视与调用线程处于同一桌面环境下的所有线程。
返回值:如果方法执行成功,返回钩子处理函数的句柄。如果失败,返回NULL。
备注:
SetWindowsHookEx可以用来将一个DLL注入到其他的进程中。
32位的DLL不能被注入到64位的进程中,同样,64位的DLL也不能被注入到32位的进程中。
如果应用程序需要在其它的进程中使用钩子,那么必须遵从:32位的应用程序调用SetWindowsHookEx将32位的DLL注入到32位的进程中,64位的应用程序调用SetWindowsHookEx将64位的DLL注入到64位的进程中。
32位的DLL和64位的DLL必须具有不同的名称。
如果参数hMod为空,参数dwThreadId为0或者指定了由另外进程创建的线程ID,就可能会产生错误。
虽然调用CallNextHookEx方法链接到下一个钩子处理函数是可选的,但是强烈建议这么做;
否则,其它已经安装了钩子的应用程序将不接收钩子通知,可能导致行为错误。
除非你完全确定需要阻止其它应用程序得到通知,否则都应该调用CallNextHookEx方法。
在应用程序结束前,应用程序必须调用UnhookWindowsHookEx方法来释放与该钩子相关的系统资源。
钩子的作用域取决于钩子的类型。一些钩子只能是全局范围的,其它一些仅仅能在指定的线程中使用。
如下表所示:
Hook | Scope |
WH_CALLWNDPROC | Thread or global |
WH_CALLWNDPROCRET | Thread or global |
WH_CBT | Thread or global |
WH_DEBUG | Thread or global |
WH_FOREGROUNDIDLE | Thread or global |
WH_GETMESSAGE | Thread or global |
WH_JOURNALPLAYBACK | Global only |
WH_JOURNALRECORD | Global only |
WH_KEYBOARD | Thread or global |
WH_KEYBOARD_LL | Global only |
WH_MOUSE | Thread or global |
WH_MOUSE_LL | Global only |
WH_MSGFILTER | Thread or global |
WH_SHELL | Thread or global |
WH_SYSMSGFILTER | Global only |
对于指定的钩子类型,线程钩子先被调用,然后是全局钩子。
全局钩子是共享资源,安装一个钩子会影响同一桌面环境下做为调用线程的所有应用程序。所有的全局钩子函数都应该在Libraries中。全局钩子应该被分发到特定目的的应用程序中,或者在程序调试中间,来辅助开发。不再需要钩子的库应该移除钩子处理函数。
钩子(HOOK)函数教程(二十二)
方法17 :ShellProc Function
The ShellProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The function receives notifications of Shell events from the system.
The HOOKPROC type defines a pointer to this callback function. ShellProc is a placeholder for the application-defined or library-defined function name.
ShellProc钩子子程是同SetWindowsHookEx一起使用的、应用程序定义的或者库定义的回调函数。该方法接收来自系统的加壳事件通知。HOOKPROC类型定义了指向该方法的指针。ShellProc是应用程序定义的或者库定义的方法的名字。 本zdw
LRESULT CALLBACK ShellProc(
int nCode, 内容来自zdwork.cn
WPARAM wParam, zdwork.cn
LPARAM lParam
);
Parameters参数 内容来自zdwork.cn
nCode :[in] Specifies the hook code. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. www.zdwork.cn
指定钩子代码。如果nCode小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不进行进一步的处理,并且应该返回由CallNextHookEx方法返回的返回值。该参数可以是下列值: 内容来自zdwork.cn
1.HSHELL_ACCESSIBILITYSTATE
Windows 2000/XP: The accessibility state has changed. 可访问性已经改2.HSHELL_ACTIVATESHELLWINDOW
The shell should activate its main window. 外壳应该激活它的主窗口。3.HSHELL_APPCOMMAND
Windows 2000/XP: The user completed an input event (for example, pressed an application command button on the mouse or an application command key on the keyboard), and the application did not handle the WM_APPCOMMAND message generated by that input. zdwork.cn
用户完成一个输入事件(例如,按下应用程序鼠标上的命令按钮或者键盘上的命令键),应用程序没有处理由该输入产生的WM_APPCOMMAND 消息。
If the Shell procedure handles the WM_COMMAND message, it should not call CallNextHookEx. See the Return Value section for more information.
如果Shell子程获得了WM_COMMAND消息的句柄,不应该调用CallNextHookEx 。
4.HSHELL_GETMINRECT
A window is being minimized or maximized. The system needs the coordinates of the minimized rectangle for the window. 窗口正在被最小化或者最大化。系统需要窗体的最小矩形框的坐标。
5.HSHELL_LANGUAGE 本文来自
Keyboard language was changed or a new keyboard layout was loaded.键盘语言被改变了或者新的键盘布局被加载了。 www.zdwork.cn
6.HSHELL_REDRAW copyright
The title of a window in the task bar has been redrawn. 任务栏中的窗口标题被重绘了。
7.HSHELL_TASKMAN
The user has selected the task list. A shell application that provides a task list should return TRUE to prevent Microsoft Windows from starting its task list. 用户选择了任务列表。提供了任务列表的加壳应用程序应该返回TRUE,来阻止windows启动任务列表。
8.HSHELL_WINDOWACTIVATED
The activation has changed to a different top-level, unowned window. 激活动作变成了不同的top-level,unowned 的窗口。(即,激活了不同的不明窗口,使其处于最上层。) 内容来自zdwork.cn
9.HSHELL_WINDOWCREATED
A top-level, unowned window has been created. The window exists when the system calls this hook. 顶层的、不受控制的窗体已经被创建。当系统调用该钩子时,窗口存在。 内容来自zdwork.cn
10.HSHELL_WINDOWDESTROYED
A top-level, unowned window is about to be destroyed. The window still exists when the system calls this hook. 顶层的、不受控制的窗体即将被销毁。当系统调用该钩子的时候该窗体依然存在。
11.HSHELL_WINDOWREPLACED 本
Windows XP: A top-level window is being replaced. The window exists when the system calls this hook. 在Windows XP环境下,顶层的窗体正在被替换掉。当系统调用该钩子时,窗口存在。 内容来自zdwork.cn
wParam www.zdwork.cn
[in] The value depends on the value of the nCode parameter, as shown in the following table.该值取决于参数 nCode ,如下表所示。 www.zdwork.cn
nCode c | wParam |
HSHELL_ACCESSIBILITYSTATE
copyright
| Windows 2000/XP: Indicates which accessibility feature has changed state. This value is one of the following: ACCESS_FILTERKEYS,ACCESS_MOUSEKEYS, or ACCESS_STICKYKEYS. 在Windows XP 环境下:指示哪种访问特征已经被改变了状态。值可以是下列之一:ACCESS_FILTERKEYS,ACCESS_MOUSEKEYS, ACCESS_STICKYKEYS. |
HSHELL_APPCOMMAND zdwork.cn | Windows 2000/XP: Where the WM_APPCOMMAND message was originally sent; for example, the handle to a window.本文 是WM_APPCOMMAND消息最初发出的位置,例如,窗口的句柄。 |
HSHELL_GETMINRECT | Handle to the minimized or maximized window.最小化或者最大化的窗体的句柄。 |
HSHELL_LANGUAGE 本文来 | Handle to the window.窗口句柄。 |
HSHELL_REDRAW | Handle to the redrawn window.重化窗口句柄。
|
HSHELL_WINDOWACTIVATED zdwork.cn
| Handle to the activated window.活动窗口句柄。
www.zdwork.cn
|
HSHELL_WINDOWCREATED | Handle to the created window.被创建的窗口的句柄。
|
HSHELL_WINDOWDESTROYED | Handle to the destroyed window.被销毁的窗口的句柄。 |
HSHELL_WINDOWREPLACED 内容来自zdwork.cn | Windows XP: Handle to the window being replaced.即将被替换的窗体的句柄。 |
lParam
[in] The value depends on the value of the nCode parameter, as shown in the following table. 该值取决于参数nCode。如下表所示。
nCode zdwork.cn | lParam www.zdwork.cn
|
HSHELL_APPCOMMAND 内容来自zdwork.cn
| Windows 2000/XP:GET_APPCOMMAND_LPARAM(lParam) is the application command corresponding to the input event. GET_APPCOMMAND_LPARAM是对输入事件做出响应的应用程序命令。 zdwork.cn GET_DEVICE_LPARAM(lParam) indicates what generated the input event; for example, the mouse or keyboard. GET_DEVICE_LPARAM指示是什么生成了输入事件。例如,鼠标或者键盘。 GET_FLAGS_LPARAM(lParam) depends on the value of cmd in WM_APPCOMMAND. For example, it might indicate which virtual keys were held down when the WM_APPCOMMAND message was originally sent. GET_FLAGS_LPARAM(lParam)依赖于 WM_APPCOMMAND中CMD的值。例如,可以指示当WM_APPCOMMAND消息被发出的时候,哪个虚拟键被按下。
|
HSHELL_GETMINRECT zdwork.cn | Pointer to a RECT structure. RECT结构的指针
|
HSHELL_LANGUAGE www.zdwork.cn | Handle to a keyboard layout. 键盘布局的句柄。
|
HSHELL_REDRAW www.zdwork.cn | The value is TRUE if the window is flashing, or FALSE otherwise. 如果窗口正在闪烁(重绘过程中),该值为true,其他为false 内容来自zdwork.cn |
HSHELL_WINDOWACTIVATED zdwork.cn | The value is TRUE if the window is in full-screen mode, or FALSE otherwise. 如果窗体处于全屏模式,该值是true,否则为false。
|
HSHELL_WINDOWREPLACED
| Windows XP: Handle to the new window.新窗体的句柄。 |
Return Value返回值 本文来自
The return value should be zero unless the value of nCode is HSHELL_APPCOMMAND and the shell procedure handles the WM_COMMAND message. In this case, the return should be nonzero.
如果nCode的值是HSHELL_APPCOMMAND,shell子程句柄指向WM_COMMAND 消息,在这种情况下,返回值是非0。其他情况下,返回值是0。
Remarks备注 zdwork.cn
Install this hook procedure by specifying the WH_SHELL hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function. 通过指定WH_SHELL 钩子类型以及在SetWindowsHookEx的方法中的指向钩子子程的指针来安装该钩子子程
钩子(HOOK)函数教程(二十三)
方法18 :SysMsgProc Function
The SysMsgProc hook procedure is a library-defined callback function used with the SetWindowsHookEx function. The system calls this function after an input event occurs in a dialog box, message box, menu, or scroll bar, but before the message generated by the input event is processed. The function can monitor messages for any dialog box, message box, menu, or scroll bar in the system.
SysMsgProc钩子子程是同SetWindowsHookEx一起使用的在库中定义的回调函数。在对话框、消息框、菜单、滚动条中所属的输入事件发生后,在这些消息被系统处理之前,系统调用该方法。该方法能够为系统中任何对话框、消息框、菜单、滚动条监视消息。
The HOOKPROC type defines a pointer to this callback function. SysMsgProc is a placeholder for the application-defined or library-defined function name. 内容来自zdwork.cnHOOKPROC类型定义了回调函数的指针,SysMsgProc是应用程序定义的或者库定义的方法的名字。
LRESULT CALLBACK SysMsgProc(
int nCode, copyright
WPARAM wParam,
LPARAM lParam
);
Parameters参数
nCode
[in] Specifies the type of input event that generated the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. 指定生成该消息的输入事件的类型。如果nCode小于0,钩子子程必须将消息传递给CallNextHookEx方法,自己不进行进一步的处理,并且应该返回由CallNextHookEx方法返回的返回值。。该参数可以是以下值之一: zdwork.cn
1.MSGF_DIALOGBOX :The input event occurred in a message box or dialog box. 输入事件在消息框或者对话框中发生。
2.MSGF_MENU :The input event occurred in a menu.输入事件在菜单中发生。
3.MSGF_SCROLLBAR :The input event occurred in a scroll bar.输入事件在滚动条中发生。 内容来自zdwork.cn
wParam :This parameter is not used. 该参数未使用。
lParam :[in] Pointer to an MSG message structure.指向MSG消息结构的指针。
Return Value 返回值
If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. 本文
If nCode is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_SYSMSGFILTER hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the target window procedure.
如果nCode小于0,钩子子程必须返回由CallNextHookEx方法返回的返回值。如果nCode大于等于0,并且钩子子程还没有处理该消息,强烈要求调用CallNextHookEx方法并返回由它返回的返回值。否则,其他已经安装了WH_SYSMSGFILTER钩子的应用程序将接收不到钩子通知,可能导致行为错误。如果钩子子程已经处理了该消息,应该返回非0 值,来阻止系统将消息传递给目标窗体程序。
Remarks备注
An application installs the hook procedure by specifying the WH_SYSMSGFILTER hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.
应用程序安装该钩子通过:指定WH_SYSMSGFILTER钩子类型;指定在调用SetWindowsHookEx方法的指向钩子子程的指针
钩子(HOOK)函数教程(二十四)
方法19 :UnhookWindowsHookEx Function www.zdwork.cn
The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
UnhookWindowsHookEx方法移除由SetWindowsHookEx方法安装在钩子链表中的钩子子程。
BOOL UnhookWindowsHookEx(HHOOK hhk); www.zdwork.cn
Parameters 参数
copyright
hhk :[in] Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. 即将被移除的钩子的句柄。该参数是由前面调用SetWindowsHookEx的方法所保留的钩子句柄。
Return Value 返回值
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
www.zdwork.cn
如果该方法执行成功,返回非0值。如果卸载失败,返回0。调用GetLastError可以得到更多的错误信息。
Remarks备注
The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns. If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.
在UnhookWindowsHookEx方法返回后,钩子子程可能处于正在被其他线程调用的状态。如果钩子子程不是被并发调用,钩子子程会在UnhookWindowsHookEx方法返回前被迅速的移除
钩子(HOOK)函数教程(二十五)
下面是各种Notification即通知。
通知1:WM_CANCELJOURNAL Notification
The WM_CANCELJOURNAL message is posted to an application when a user cancels the application's journaling activities. The message is posted with a NULL window handle.
当用户取消应用程序的日志记录活动时,WM_CANCELJOURNAL消息被传递给应用程序。该消息以空窗体句柄的方式来传递。
WM_CANCELJOURNAL
Return Value 返回值
This message does not return a value. It is meant to be processed from within an application's main loop or a GetMessage hook procedure, not from a window procedure.
该消息没有返回值。这意味着在应用程序的主循环中被处理,或者在GetMessage钩子子程内被处理,而不是在窗体程序中被处理。
Remarks 备注
Journal record and playback modes are modes imposed on the system that let an application sequentially record or play back user input. The system enters these modes when an application installs a JournalRecordProc or JournalPlaybackProc hook procedure. When the system is in either of these journaling modes, applications must take turns reading input from the input queue. If any one application stops reading input while the system is in a journaling mode, other applications are forced to wait.
日志记录和回放模式是强加在系统上的模式,它们使应用程序序列化记录和回放用户的输入。当应用程序安装JournalRecordProc 和JournalPlaybackProc钩子子程时,系统就进入这样的模式。当系统处于这些模式中的任意一个时,应用程序必须轮流从输入队列读入输入。当系统处于记录模式时,如果任何一个应用程序停止读取输入,其他应用程序被迫要等待。
To ensure a robust system, one that cannot be made unresponsive by any one application, the system automatically cancels any journaling activities when a user presses CTRL+ESC or CTRL+ALT+DEL. The system then unhooks any journaling hook procedures, and posts a WM_CANCELJOURNAL message, with a NULL window handle, to the application that set the journaling hook.
为了保证系统的强壮性,一个应用程序不能因为其他应用程序的影响而失去响应。当用户按下时CTRL+ESC 或者CTRL+ALT+DEL时,系统自动取消任何记录行为,然后系统卸载任何记录钩子子程,向安装该记录钩子的应用程序传递一个WM_CANCELJOURNAL消息,该消息含有一个空窗体句柄, www.zdwork.cn
The WM_CANCELJOURNAL message has a NULL window handle, therefore it cannot be dispatched to a window procedure. There are two ways for an application to see a WM_CANCELJOURNAL message: If the application is running in its own main loop, it must catch the message between its call to GetMessage or PeekMessage and its call to DispatchMessage. If the application is not running in its own main loop, it must set a GetMsgProc hook procedure (through a call to SetWindowsHookEx specifying the WH_GETMESSAGE hook type) that watches for the message.
WM_CANCELJOURNAL消息包含一个空窗体句柄,因此不能被分派给窗体程序。应用程序有2种方式可以查看WM_CANCELJOURNAL消息:如果应用程序在它自己的主循环下运行,必须在它调用GetMessage或者PeekMessage与DispatchMessage之间,捕获该消息。如果应用程序没有运行在自己的主循环下,必须设置tMsgProc钩子子程(通过指定WH_GETMESSAGE钩子类型调用dowsHookEx)来监视消息。
When an application sees a WM_CANCELJOURNAL message, it can assume two things: the user has intentionally cancelled the journal record or playback mode, and the system has already unhooked any journal record or playback hook procedures.
当应用程序查看WM_CANCELJOURNAL消息时,可以假设2件事情:用户已经特意取消了记录和回放模式,并且,系统已经卸载了任何记录或者回放钩子子程。
Note that the key combinations mentioned above (CTRL+ESC or CTRL+ALT+DEL) cause the system to cancel journaling. If any one application is made unresponsive, they give the user a means of recovery. The VK_CANCEL virtual key code (usually implemented as the CTRL+BREAK key combination) is what an application that is in journal record mode should watch for as a signal that the user wishes to cancel the journaling activity. The difference is that watching for VK_CANCEL is a suggested behavior for journaling applications, whereas CTRL+ESC or CTRL+ALT+DEL cause the system to cancel journaling regardless of a journaling application's behavior. zdwork.cn
注意: 前面提到的组合键(CTRL+ESC 或者CRL+ALT+DEL)会导致系统停止记录。如果任何一个应用程序无响应,它们给用户提供了一种恢复的方式。虚拟键值VK_CANCEL(通常以 CTRL+BREAK来实现)是任何一个处于日志记录模式的应用程序都应该监视的,该值被用作用户希望取消记录活动的信号。不同之处在于,记录型应用程序监视VK_CANCEL是一种建议,但是CTRL+ESC 或者CTRL+ALT+DEL引发系统取消记录,忽略监视型应用程序的行为
钩子(HOOK)函数教程(二十六)
通知2:WM_QUEUESYNC Notification
The WM_QUEUESYNC message is sent by a computer-based training (CBT) application to separate user-input messages from other messages sent through the WH_JOURNALPLAYBACK Hook procedure. zdwork.cn
WM_QUEUESYNC消息是由CBT应用程序送出的,用来区分用户输入的消息和其它由WH_JOURNALPLAYBACK钩子子程发出的消息。 www.zdwork.cn
Syntax :WM_QUEUESYNC
Return Value 返回值
www.zdwork.cn
A CBT application should return zero if it processes this message.
如果CBT应用程序处理该消息,返回值应该是0。
Remarks 备注
Whenever a CBT application uses the WH_JOURNALPLAYBACK Hook procedure, the first and last messages are WM_QUEUESYNC. This allows the CBT application to intercept and examine user-initiated messages without doing so for events that it sends. 内容来自zdwork.cn
If an application specifies a NULL window handle, the message is posted to the message queue of the active window. www.zdwork.cn
不管CBT应用程序什么时候使用WH_JOURNALPLAYBACK钩子子程,第一个和最后一个消息都是WM_QUEUESYNC.这样的话,CBT应用程序就能够截取、检验用户初始化的消息,而不需要对它自己送出的程序也这样做。
钩子(HOOK)函数教程(二十七)
下面是应用Hook时会用到的各种结构。
结构1:CBT_CREATEWND Structure zdwork.cn
The CBT_CREATEWND structure contains information passed to a WH_CBT hook procedure, CBTProc, before a window is created.
该结构包含有:在一个窗口被创建之前传递给WH_CBT钩子子程,即CBTProc,的信息。 www.zdwork.cnSyntaxy语法
typedef struct {
LPCREATESTRUCT lpcs;
HWND hwndInsertAfter;
} CBT_CREATEWND, *LPCBT_CREATEWND;
Members成员
lpcs
Pointer to a CREATESTRUCT structure that contains initialization parameters for the window about to be created. 一个指向CREATESTRUCT结构的指针,该结构包含即将被创建的窗体的初始化参数。
hwndInsertAfter zdwork.cn
Handle to the window whose position in the Z order precedes that of the window being created.
窗体的句柄,该窗体的Z轴位置在正在被创建的窗体的Z轴位置之前。
结构2:CBTACTIVATESTRUCT Structure
The CBTACTIVATESTRUCT structure contains information passed to a WH_CBT hook procedure, CBTProc, before a window is activated.
CBTACTIVATESTRUCT 结构包含在窗体被激活之前,传递给WH_CBT钩子子程CBTProc 的信息。 zdwork.cnSyntax
typedef struct {
BOOL fMouse;
HWND hWndActive;
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
Members 成员
fMouse
内容来自zdwork.cn
Specifies whether the window is being activated as a result of a mouse click. This value is TRUE if a mouse click is causing the activation or FALSE if it is not. 指定窗体是否是由于鼠标的点击而导致被激活。如果是因为鼠标的点击而引发了窗体的激活,返回true,否则返回false。
hWndActive
Handle to the active window. 活动窗口的句柄。
结构3:CWPRETSTRUCT Structure
The CWPRETSTRUCT structure defines the message parameters passed to a WH_CALLWNDPROCRET hook procedure, CallWndRetProc.
CWPRETSTRUCT结构定义了传递给WH_CALLWNDPROCRET钩子子程CallWndRetProc的消息参数。Syntax语法
typedef struct { zdwork.cn
LRESULT lResult;
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPRETSTRUCT, *PCWPRETSTRUCT;
Members成员
lResult
Specifies the return value of the window procedure that processed the message specified by the message value. 指定了窗体程序的返回值,该窗体程序处理由 message 值指定的消息。
lParam / wParam
Specifies additional information about the message. The exact meaning depends on the message value. 指定消息的附加信息。附加的意义取决于message的值。
message
Specifies the message. 指定消息。
hwnd
Handle to the window that processed the message specified by the message value. 处理由message的值指定的消息的窗体的窗体句柄
钩子(HOOK)函数教程(二十八)
结构4:CWPSTRUCT Structure
The CWPSTRUCT structure defines the message parameters passed to a WH_CALLWNDPROC hook procedure, CallWndProc.
CWPSTRUCT 结构定义了传递给WH_CALLWNDPROC钩子子程CallWndProc的消息参数。
Syntax
typedef struct {
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPSTRUCT, *PCWPSTRUCT;
Members
lParam / wParam
Specifies additional information about the message. The exact meaning depends on the message value. 指定消息的附加信息。附加的意义取决于message的值。
message
Specifies the message. 指定消息
hwnd
Handle to the window to receive the message. 接收消息的窗体的句柄。
结构5:DEBUGHOOKINFO Structure
The DEBUGHOOKINFO structure contains debugging information passed to a WH_DEBUG hook procedure, DebugProc.
DEBUGHOOKINFO结构包含有传递给WH_DEBUG钩子子程DebugProc的调试信息。
typedef struct {
DWORD idThread;
DWORD idThreadInstaller;
LPARAM lParam;
WPARAM wParam;
int code;
} DEBUGHOOKINFO, *PDEBUGHOOKINFO;
Members成员
idThread
Handle to the thread containing the filter function. 包含过滤方法的线程的句柄。
idThreadInstaller
Handle to the thread that installed the debugging filter function. 安装调试过滤方法的线程的句柄。
lParam / wParam
Specifies the value to be passed to the hook in the lParam parameter of the DebugProc callback function. 指定在DebugProc回调函数的lParam/ wParam 参数中,要传递给钩子的值。
code
Specifies the value to be passed to the hook in the nCode parameter of the DebugProc callback function. 指定在DebugProc回调函数的nCode 参数中,要传递给钩子的值。
结构6:EVENTMSG Structure
The EVENTMSG structure contains information about a hardware message sent to the system message queue. This structure is used to store message information for the JournalPlaybackProc callback function. copyright
该结构包含有关于硬件的消息,该消息被发送给系统的消息队列。该结构用来为JournalPlaybackProc回调函数存储消息的信息。
typedef struct {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} EVENTMSG, *PEVENTMSG;
message
Specifies additional information about the message. The exact meaning depends on the message value. 指定消息的附加信息。附加的意义取决于message的值。
time
Specifies the time at which the message was posted. 消息被传递时的时间 。
hwnd
Handle to the window to which the message was posted. 消息被传给的窗口的句柄。
钩子(HOOK)函数教程(二十九)
结构7:KBDLLHOOKSTRUCT Structure
The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event.
该结构包含有低层键盘输入事件的信息。
copyright
Syntax语法
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo; copyright
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
Members成员
vkCode
Specifies a virtual-key code. The code must be a value in the range 1 to 254. 指定虚拟键值。该值必须在1到254的范围内。
scanCode
Specifies a hardware scan code for the key.指定键的硬件扫描码。
flags
Specifies the extended-key flag, event-injected flag, context code, and transition-state flag. This member is specified as follows. An application can use the following values to test the keystroke flags.
指定扩展键标志,事件注入标志,上下文代码,转换状态码。成员如下所示。应用程序可以使用下列值来检查键盘敲击标志。
Value值
Purpose目的
LLKHF_EXTENDED
Test the extended-key flag. 测试扩展键标志。 copyright
LLKHF_INJECTED copyright
Test the event-injected flag. 测试事件注入标志
LLKHF_ALTDOWN
Test the context code. 测试上下文代码。
LLKHF_UP
Test the transition-state flag. 测试转换状态码。
0 :Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0. 指定该键是否是扩展键,例如:功能键、数字键盘上的键。是扩展键为1,否则为0。 copyright
1-3 :Reserved. 保留。
4 :Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0. 指定事件是否被注入。被注入为1,否则为0。
5 :Specifies the context code. The value is 1 if the ALT key is pressed; otherwise, it is 0. 指定上下文代码。如果按下了ALT,该值为1,否则为0
6 :Reserved. 保留。
7 :Specifies the transition state. The value is 0 if the key is pressed and 1 if it is being released.指定转换状态。如果该键被按下该值为1,如果被释放为0。
time
Specifies the time stamp for this message, equivalent to what GetMessageTime would return for this message. 指定消息的时间戳,相当于GetMessageTime返回的值。
dwExtraInfo
Specifies extra information associated with the message. 指定和该消息相关联的扩展信息
钩子(HOOK)函数教程(三十)
结构8 :MOUSEHOOKSTRUCT Structure copyright
The MOUSEHOOKSTRUCT structure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.
MOUSEHOOKSTRUCT结构包含有传递给WH_MOUSE钩子子程MouseProc的,关于鼠标事件的信息。Syntax语法
typedef struct {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
Members成员
pt :Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 指定在屏幕坐标系下,包含有光标x、y坐标的POINT结构。 copyright
hwnd : Handle to the window that will receive the mouse message corresponding to the mouse event. 希望对鼠标事件做出响应、接收鼠标消息的窗体的句柄。
wHitTestCode :Specifies the hit-test value. For a list of hit-test values, see the description of the WM_NCHITTEST message. 指定点击测试值。查看WM_NCHITTEST消息可以得到值的列表。
dwExtraInfo :Specifies extra information associated with the message. 指定和该消息相关联的附加信息。
结构9:MOUSEHOOKSTRUCTEX Structure
The MOUSEHOOKSTRUCTEX structure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.
MOUSEHOOKSTRUCTEX结构包含有传递给WH_MOUSE钩子子程MouseProc的关于鼠标事件的信息。
This is an extension of the MOUSEHOOKSTRUCT structure that includes information about wheel movement or the use of the X button. copyright
这是对MOUSEHOOKSTRUCT的扩展。包含有滚轮的活动和X键的使用。
Syntax语法
typedef struct { copyright
MOUSEHOOKSTRUCT MOUSEHOOKSTRUCT;
DWORD mouseData;
} MOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
Members成员
MOUSEHOOKSTRUCT
The members of a MOUSEHOOKSTRUCT structure make up the first part of this structure.
MOUSEHOOKSTRUCT结构的成员构成了该结构的前面部分。
mouseData
If the message is WM_MOUSEWHEEL, the HIWORD of this member is the wheel delta. The LOWORD is undefined and reserved. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.
如果消息是WM_MOUSEWHEEL,该成员的HIWORD就是wheel delta。LOWORD做为保留未定义。正值表示滚轮向前旋转,即远离用户的方向;负值表示滚轮向后旋转,即朝向用户的方向。滚轮的点击被定义为WHEEL_DELTA, 具体值为120。
If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, or WM_NCXBUTTONDBLCLK, the HIWORD of mouseData specifies which X button was pressed or released, and the LOWORD is undefined and reserved. This member can be one or more of the following values. Otherwise, mouseData is not used.
如果消息是WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或者 WM_NCXBUTTONDBLCLK, mouseData 的HIWORD值指定哪个X键被按下或者释放,LOWORD做为保留未定义。该成员可以是以下值中的一个或者多个。否则,mouseData未使用。
1.XBUTTON1 :The first X button was pressed or released. 第一个X键被按下或者释放。
2.XBUTTON2 :The second X button was pressed or released.第二个X键被按下或者释放。
钩子(HOOK)函数教程(三十一)
结构9:MSLLHOOKSTRUCT Structure
The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. (msdn错误) copyright
该MSLLHOOKSTRUCT结构包含有低层键盘输入事件的信息。
Syntax语法
typedef struct {
POINT pt;
DWORD mouseData;
DWORD flags; copyright
DWORD time;
ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
Members成员 copyright
pt :Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 指定在屏幕坐标系下,包含有光标x、y坐标的POINT结构。
mouseData
If the message is WM_MOUSEWHEEL, the HIWORD of this member is the wheel delta. The LOWORD is undefined and reserved. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.
如果消息是WM_MOUSEWHEEL,该成员的HIWORD就是wheel delta。LOWORD做为保留未定义。正值表示滚轮向前旋转,即远离用户的方向;负值表示滚轮向后旋转,即朝向用户的方向。滚轮的点击被定义为WHEEL_DELTA, 具体值为120。
If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, or WM_NCXBUTTONDBLCLK, the HIWORD of mouseData specifies which X button was pressed or released, and the LOWORD is undefined and reserved. This member can be one or more of the following values. Otherwise, mouseData is not used.
如果消息是WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或者 WM_NCXBUTTONDBLCLK, mouseData 的HIWORD值指定哪个X键被按下或者释放,LOWORD做为保留未定义。该成员可以是以下值中的一个或者多个。否则,mouseData未使用。
1.XBUTTON1:The first X button was pressed or released. 第一个X键被按下或者释放。
2.XBUTTON2 :The second X button was pressed or released.第二个X键被按下或者释放。
flags
Specifies the event-injected flag. An application can use the following value to test the mouse flags. 指定事件注入标志。应用程序可以使用下列值来测试鼠标标志。
Value
Purpose
LLMHF_INJECTED
Test the event-injected flag.测试事件注入标志。
Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0. 事件是否被注入。如果被注入,为 1,否则为0
1-15 :Reserved.保留
time
Specifies the time stamp for this message. 消息的时间戳。
dwExtraInfo
Specifies extra information associated with the message. 消息的扩展信息