SetWindowsHookEx详解 api注入dll WinAPI——钩子函数大全

Stella981
• 阅读 593

SetWindowsHookEx详解 api注入dll WinAPI——钩子函数大全123

http://blog.csdn.net/mmllkkjj/article/details/6627188

转载  https://my.oschina.net/zengfr

github:https://github.com/zengfr/ gitee:https://gitee.com/zengfr/

**函数功能:**该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.

**函数原形:**HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId );

参数:

**idHook:**指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:

WH_CALLWNDPROC(4): 安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程.

**WH_CALLWNDPROCRET(12) :**安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.

**WH_CBT(5) :**安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.

**WH_DEBUG(9):**安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.

**WH_FOREGROUNDIDLE(11):**安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.

**WH_GETMESSAGE(3):**安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.

**WH_JOURNALPLAYBACK(1):**安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.

**WH_JOURNALRECORD(0):**安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.

**WH_KEYBOARD(2):**安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.

**WH_KEYBOARD_LL(13):**此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.

**WH_MOUSE(7):**安装一个挂钩处理过程,对鼠标消息进行监视. 详情参见 MouseProc挂钩处理过程.

**WH_MOUSE_LL(14):**此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.

**WH_MSGFILTER(-1):**安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.

**WH_SHELL(10):**安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.

**WH_SYSMSGFILTER(6):**安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.

**lpfn:**指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程.

**hMod:**指示了一个动态链接的句柄,该动态连接库包含了参数lpfn 所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0).

**dwThreadId:**指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关.

**返回值:**若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError函数.

**备注:**若参数hMod为NULL,而参数dwThreadld为0或者指示了一个其他进程创建的线程标识符,则会产生错误.

对函数CallNextHookEx进行调用以下链接下一个挂钩处理过程是可选的,但也是被推荐的否则,其他安装了此挂钩的应用程序将无法获得此挂钩通知,从而可能导致错误的行为.除非您确实希望防止其他应用程序看到此挂钩通知,您应当调用函数CallNextHookEx.

在终止一个应用程序之前,必须调用函数UnhookWindowsHookEx以释放与此挂钩相关的系统资源.

挂钩的作用域依赖与挂钩的类型.一些挂钩只能被设置成系统作用域,其他挂钩(如下所示)还可以被设置为某一特定线程的作用域:

WH_CALLWNDPROC 线程或系统

WH_CALLWNDPROCRET 线程或系统

WH_CBT 线程或系统

WH_DEBUG 线程或系统

WH_FOREGROUNDIDLE 线程或系统

WH_GETMESSAGE 线程或系统

WH_JOURNALPLAYBACK 系统

WH_JOURNALRECORD 系统

WH_KEYBOARD 线程或系统

WH_KEYBOARD_LL 线程或系统

WH_MOUSE 线程或系统

WH_MOUSE_LL 线程或系统

WH_MSGFILTER 线程或系统

WH_SHELL 线程或系统

WH_SYSMSGFILTER 系统

对于一个特定的挂钩类型,现成的挂钩先被调用,然后才是系统挂钩被调用.

系统挂钩作为共享资源,安装一次就对所用应用程序产生影响.所有的系统挂钩函数必须在库中.系统挂钩应当被限制用于一些特殊用途的应用程序或者用来作为应用程序调试的辅助工具.不再需要挂钩的库应当将相应的挂钩处理过程删除掉.

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

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,库文件,用户自定义.

SysMsgProc

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

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

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

参数:

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

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

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

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

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

若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进行调用,以使得应用程序能够检查和控制在对对话框、消息框、菜单条、滚动条的内部处理过程中产生的,或是由用户按下<Alt+Tab>组合键以激活不同窗口时产生的消息流.

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

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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

WinAPI——钩子函数大全3

**函数原形:**LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam);

参数:

**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挂钩类型及相应挂钩处理过程首地址来实现,如果用在日志回调过程中按下<Ctrl+Esc>或<Ctrl+Alt+Del>组合键,系统将终止回调,取消此日志回调过程,并寄送一个WM_CANCELJOURNAL消息给日志应用程序.

若此挂钩处理过程返回的消息在WM_KEYFIRST 或WM_KEYLAST的范围内,则以下情形发生.

结构EVENTMSG的paramL成员指示按下的虚拟键编码值,结构EVENTMSG的paramH成员指示扫描吗,这种情况下无法指示出重复按键的次数,这个事件仅表示一个按键事件.

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

JournalRecordProc

 函数功能: 该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,此函数纪录系统从系统消息队列中删除的消息,此后,一个应用程序可以通过使用挂钩处理过程JournalPlaybackProc对此消息进行回调.

类型HOOKPROC定义了指向此类回调函数的指针, JournalRecordProc是应用程序定义或库定义的相应回调函数名的位置标识符.

**函数原形:**LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);

参数:

**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被实现为组合键< CTRL+BREAK>),此虚拟键应被应用程序解释为用户希望终止进行日志纪录的信号,而应用程序对此进行响应,结束相应的纪录序列,并删除挂钩处理过程JournalRecordProc,在这里,删除挂钩处理过程是很重要的,此举使得应用程序免于因为在一个挂钩处理过程内部被挂起而将系统锁住.

这种作为终止日志纪录信号的角色使得组合键<CTRL+BREAK>本身无法被纪录,而组合键<CTRL+C>并不充当日志纪录信号的角色,所以可以被纪录,这里还有两种组合键是不能被纪录的:即<CTRL+ESC> 和<CTRL+ALT+DEL>,这两组组合键导致系统终止所有的日志活动(纪录或回调),删除所有的日志挂钩,并将消息WM_CANCELJOURNAL寄送给日志应用程序.

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

KeyboardProc

**函数功能:**该函数是应用程序或库文件定义的回调函数, 它与函数SetWindowsHookEx搭配使用,当应用程序调用函数 GetMessage 或PeekMessage 并且当前恰好有一个键盘消息 (WM_KEYUP or WM_KEYDOWN) 将要被处理时,系统就调用此挂钩处理过程.

类型HOOKPROC定义了指向此类回调函数的指针, KeyboardProc是应用程序定义或库定义的相应回调函数名的位置标识符.

**函数原形:**LRESULT CALLBACK KeyboardProc(int code,LPARAM lParam);

参数:

**code:**指定一个代码,该代码被挂钩处理过程用于决定如何处理此消息,此参数可以为以下值之一:

HC_ACTION  参数 wParam 和 lParam包含一个击键消息的信息.

HC_NOREMOVE  参数wParam and lParam包含一个击键消息的信息,并且此击键消息尚未从消息队列中被删除(一个应用程序调用函数PeekMessage 并设置了PM_NOREMOVE 标志).

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

**wParam:**指示产生此击键消息的虚拟键代码.

**lParam:**指示重复次数,扫描码,扩展标志,上下文代码,此前的键状态标志和变化状态标志,此参数可以是以下值的组合值:

0-15位:指示重复次数,此值纪录力偶由于用户继续摁键引发的击键重复次数.

16-23位:指示扫描码,此值依赖于键盘生产厂家.

第24位:指示此键是否为扩展键,比如功能键或数字小键盘上的键,当该键为扩展时,其值为1,否则为0.

25-28位:保留未用.

第29位:上下文代码.若Alt键被摁下,则此值为1,否则为0.  

第30位:指示此前的键状态,若在此消息被发送之前该键是摁下的,其值为1.若此前该键未被摁下,则其值为0.

第31位:指示变化状态,若此键正在被摁下,则其值位0. 正在被释放其值为1.

欲获得更多关于此lParam参数的信息,请参见 Keystroke Message Flags.

返回值: 若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,并且此挂钩处理过程并未对此消息进行处理,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_KEYBOARD的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程对此消息进行了处理,它应返回非0值以避免系统将此消息传递给挂钩键上的其他处理过程或目标窗口的处理过程.

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

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

MessageProc

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

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

**函数原形:**LRESULT CALLBACK MessageProc(int code,WPARAM wParam,LPARAM lParam); 

参数:

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

**MSGE_DDEMGR:**当动态数据交换管理库(Dynamic Data Exchange Management Library (DDEML)正在等待一个同步处理的结束时产生此事件,关于DDEML的详情,参见Dynamic Data Exchange Management Library .

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

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

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

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

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

wParam: 为NULL(0).

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

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

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

若一个应用程序使用了DDEML并实行同步处理,而且要求必须在消息被分派前处理之,则一定要使用WH_MSGFILTER挂钩.

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

MouseProc

**函数功能:**该函数是应用程序或库文件定义的回调函数, 它与函数SetWindowsHookEx搭配使用,当应用程序调用函数 GetMessage 或PeekMessage 并且当前恰好有一个鼠标消息将要被处理时,系统就调用此挂钩处理过程.

类型HOOKPROC定义了指向此类回调函数的指针, MouseProc是应用程序定义或库定义的相应回调函数名的位置标识符.

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

参数:

nCode:指示一个代码被挂钩处理过程用于决定如何处理此消息,此参数可以是以下值之一:

HC_ACTION   指示参数wParam 和lParam 包含了关于鼠标消息的信息.

HC_NOREMOVE 指示参数 wParam和lParam 中包含了关于鼠标的信息,而且此鼠标消息尚未从消息队列中被删除(一个应用程序调用函数PeekMessage并设置了 PM_NOREMOVE标志).

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

**wParam:**指示鼠标消息的标识符,

**lParam:**指向MOUSEHOOKSTRUCT 结构的[指针].

返回值: 若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,并且此挂钩处理过程尚未对此消息进行处理,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_MOUSE的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程对此消息进行了处理,它应返回非0值以避免系统将此消息传递给目标窗口的处理过程.

备注: 一个应用程序通过调用函数SetWindowsHookEx指定WM_MOUSE挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.此挂钩处理过程一定不能安装JournalPlaybackProc回调函数.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

WinAPI——钩子函数大全2

CallNextHookEx

**函数功能:**该函数发送挂钩信息给当前挂钩链中的下一个挂钩处理过程,一个挂钩处理过程可在对该挂钩信息进行处理之前或之后调用本函数.

**函数原形:**LRESULT CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam); 

参数:

**hhk:**当前挂钩的句柄.一个应用程序获得的此句柄是此前SetWindowsHookEx的调用结果.

**nCode:**指定发送给当前挂钩处理过程的挂钩代码.下一个挂钩处理函数使用此代码以决定如何处理该挂钩信息.

**wParam:**指定发送给当前挂钩处理过程的wParam值,此参数的含义依赖于与当前挂钩相关的挂钩类型

**lParam:**指定发送给当前挂钩处理过程的lParam值,此参数的含义依赖于与当前挂钩相关的挂钩类型.

**返回值:**其返回值是链中下一个挂钩处理过程的返回值,当前的挂钩处理过程也必须返回此值,此返回值的含义依赖与挂钩的类型,如果希望获得更多的信息,可参阅关于独立挂钩处理过程的介绍.

**备注:**挂钩处理过程被安置于不同的具有一定挂钩类型的挂钩链中,函数CallNextHookEx调用该链中的下一个挂钩.对函数CallNextHookEx的调用是可选的,但同时也是被极力推荐使用的,否则其他安装了挂钩的应用程序将无法收到挂钩通知,由此可能导致错误的行为.除非您确实需要使其他应用程序不能此挂钩通知,否则,您应该调用此函数CallNextHookEx.

**速查:**Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:user32.lib.

CallWndProc

**函数功能:**该函数挂钩处理过程是由应用程序定义或由库定义的回调函数,它与函数 SetWindowsHookEx配套使用,系统调用此函数无论何时一旦函数 SendMessage被调用,在将消息发送至相应的窗口处理过程之前,系统先将该消息发送至挂钩处理过程,该挂钩处理过程可以对改消息进行检查,但不能修改之.

      类型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,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了WM_CALLWNDPROC挂钩的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩没有调用函数CallNextHookEx,则返回值为0.

**备注:**挂钩处理函数CallWndPro可以对消息进行检查,但不能修改之.在该挂钩处理过程将控制返回给系统之后,该消息被发送至相应的窗口过程.

一个应用程序通过调用SetWindowsHookEx时指定WM_CALLWNDPROC挂钩类型及其相应挂钩处理过程的首地址来安装挂钩处理过程.

挂钩WM_CALLWNDPROC是在调用函数SendMessage的线程中被调用的,它并非在接受消息的线程中被调用.

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

CallWndRetProc

**函数功能:**该函数挂钩处理过程是在应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用,系统将在调用完 SendMessage之后调用之,该挂钩处理过程可以检查该消息,但不能修改之.

类型HOOKPROC定义了一类指针指向此类回调函数,CallWndRetProc 仅仅是在应用程序或库中定义的相应函数名的位置标志符.

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

参数:

**nCode:**指定该挂钩处理过程是否必须对该消息进行处理,若nCode 是HC_ACTION,则该挂钩处理过程必须处理该消息.若nCode的值小于0,则此挂钩处理过程必须不加处理的将其发送给函数CallNextHookEx并返回由 CallNextHookEx返回的值.

**wParam:**指示该消息是否由当前线程发出,若该消息由当前线程发出,其值为非0值,否则,其值为0.

**lParam:**指向一个CWPSTRUCT结构,该结构包含了此消息的详细消息.

**返回值:**若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_CALLWNDPROCRET的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程没有调用函数CallNextHookEx,则返回值为0.

备注: 一个应用程序通过调用SetWindowsHookEx时指定WM_CALLWNDPROCRET挂钩类型及其相应挂钩处理过程的首地址来安装挂钩处理过程.

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

CBTProc

**函数功能:**该函数挂钩处理过程是在应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx配套使用,系统在缉获、创建、销毁、最小化、最大化、移动或改变一个窗口尺寸之前调用它;在结束一个系统命令之前调用它;在将一个鼠标或键盘事件从系统事件队列中删除之前调用它;在设置键盘焦点之前调用它,或在与系统消息队列进行同步之前调用它,一个基于计算机培训(CBT)的应用程序使用此挂钩处理过程来从系统接收有用的通知.

       类型HOOKPROC定义了指向此类回调函数的指针,CBTProc是应用程序定义或库定义的相应回调函数名的位置标识符.

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

参数:

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_JOURNALPLAYBACK挂钩处理过程.

     此挂钩处理过程必须放在某个动态链接库中,一个应用程序通过调用函数 SetWindowsHookEx指定WH_CBT 挂钩类型与相应挂钩处理过程首地址来安装挂钩处理过程.

以下列示了参数wParam和lParam与每一种HCBT挂钩代码的关系.

指定一个长指针指向结构CBTACTIVATESTRUCT 的长指针,该结构包含了指向激活窗口的句柄,并指示被激活者是否由于点击而发生改变.

值                  参数wParam                      参数lParam

HCBT_ACTIVATE   指定将要被激活的窗口句柄.

指定一个指向结构MOUSEHOOKSTRUCT的长指针,该结构包含点击测试代码及 鼠标消息发往的窗口句柄.HCBT_ CLICKSKIPPED 值仅当一个WH_MOUSE挂钩被安装了之时才发送一个CBTProc挂钩处理过程,关于点击 测试代码的列表,参见 WM_NCHITTEST.

HCBT_CLICKSKIPPED  标识鼠标消息从系统消息队列中被删除.       

指定一个指向 CBT_CREATEWND结构的长指针,该结构包含窗口的初始化参数,这些参数包括窗口的坐标和尺寸,通过改变这些参数.一个CBTProc挂钩处理过程能够设置窗口的初始尺寸和位置.

HCBT_CREATEWND        指定新窗口的句柄.          

HCBT_DESTROYWND    指定将被销毁的窗口句柄.             未定义,必须设置为0.

指示重复次数,扫描码,键转义码,前驱键状态和上下文代码.仅当WH_KEYBOARD挂钩被安装了之时,此HCBT_KEYSKIPPED值被发送 CBTProc 挂钩处理过程.欲获得更多信息,参见 WM_KEYUP 或WM_KEYDOWN

HCBT_KEYSKIPPED       指示虚拟键的代码.         

低"字"部分指定一个显示窗口的值(SW_),以指定相应操作,详情参见ShowWindow,高"字"部分未定义.

HCBT_MINMAX   指定被最小化或最大化的窗口句柄                                

指定一个指向RECT结构的长指针,该结构包含窗口的坐标,通过改变结构的值,一个CBTProc的子处理过程能够设置窗口的最终位置.

HCBT_MOVESIZE  指定将被移动或改变尺寸的窗口句柄.

HCBT_QS                未定义,必须设置为0                       未定义,必须设置为0

HCBT_SETFOCUS  指定获得键盘焦点的窗口句柄.             指示失去键盘焦点的窗口句柄.

指示系统命令的值(SC_)以标识相应系统命令,欲知更多关于系统命令值的信息,参见WM_SYSCOMMAND.

包含与WM_SYSCOMMAND消息的lParam值相同的数据.若一个系统菜单命令被鼠标选种,则低"字"部分包含光标在屏幕坐标系中的X坐标值,高"字"部分包含Y坐标值,其他情况下,此参数未被使用.

HCBT_SYSCOMMAND

 类型HOOKPROC定义了一类指针指向此类回调函数,CBTProc 仅仅是在应用程序或库中定义的相应函数名的位置标识符.

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

DebugProc

**函数功能:**该挂钩处理过程是应用程序或库中定义的回调函数,它与函数SetWindowsHookEx搭配使用,系统在调用与任何挂钩类型和相关的挂钩处理过程之前调用它,系统传送关于被调用的挂钩的信息给DebugProc挂钩处理过程,此挂钩处理过程检查上述信息,并决定该挂钩是否被调用.

  类型HOOKPROC定义了指向此类回调函数的指针, DebugProc是应用程序定义或库定义的相应回调函数名的位置标识符.

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

参数:

**nCode:**指示挂钩处理过程是否必须处理此消息.若nCode的值是HC_ACTION,则挂钩处理过程必须处理此消息,若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.

**wParam:**指示将被调用的挂钩类型,此参数可以为以下值:

WH_CALLWNDPROC: 安装一个监视发送至目标窗口处理过程之的消息的挂钩处理过程,对该消息进行,详情参见CallWndProc挂钩处理过程.

**WH_CALLWNDPROCRET :**安装一个挂钩处理过程,以监视已刚被目标窗口处理过程处理过了的消息,详情参见 CallWndRetProc 挂钩处理过程.

**WH_CBT :**安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.

**WH_DEBUG:**安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.

**WH_FOREGROUNDIDLE:**安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.

**WH_GETMESSAGE:**安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.

**WH_JOURNALPLAYBACK:**安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.

**WH_JOURNALRECORD:**安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.

**WH_KEYBOARD:**安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.

**WH_MOUSE:**安装一个挂钩处理过程,对鼠标消息进行监视.  详情参见 MouseProc挂钩处理过程.

**WH_MSGFILTER:**安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.

**WH_SHELL:**安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.

**WH_SYSMSGFILTER:**安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.

**lParam:**指向一个DEBUGHOOKINFO结构,该结构包含希望被传送给相应挂钩处理过程的参数,为避免系统调用此挂钩,此挂钩处理过程必须返回一非0值,否则,此挂钩处理过程必须调用函数CallNextHookEx.

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

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

ForegroundIdleProc

**函数功能:**该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,系统在前台线程进入空闲状态之前调用此函数.

类型HOOKPROC定义了指向此类回调函数的指针, ForegroundIdleProc是应用程序定义或库定义的相应回调函数名的位置标识符.

**函数原形:**DWORD ForegroundIdleProc(int code,DWORD wParam,LONG lParam); 

参数:

**Code:**指示此挂钩处理过程是否必须处理消息, 若nCode的值是HC_ACTION,则挂钩处理过程必须处理此消息,若nCode之值小于0,则此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.

**wParam:**未被使用.

**lParam:**未被使用.

返回值: 若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WH_FOREGROUNDIDLE的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程没有调用函数CallNextHookEx,则返回值为0.

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

GetMsgProc

函数功能: 该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,每当函数GetMessage从应用程序的消息队列中获得了一个消息时,系统就调用此函数,在将此获得的消息传送给相应窗口处理过程之前,系统将此消息传送给该挂钩处理过程.

类型HOOKPROC定义了指向此类回调函数的指针, GetMsgProc是应用程序定义或库定义的相应回调函数名的位置标识符.

**函数原形:**LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam );  

参数:

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挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.

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

JournalPlaybackProc

函数功能: 该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用.典型地,一个应用程序通过调用此函数来对先前有JournalRecordProc挂钩处理过程纪录的一系列鼠标和键盘消息进行回放.一旦挂钩函数JournalPlaybackProc挂钩处理过程被安装,则通常的鼠标和键盘输入被禁止.

类型HOOKPROC定义了指向此类回调函数的指针, JournalPlaybackProc是应用程序定义或库定义的相应回调函数名的位置标识符.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

WinAPI——钩子函数大全

SetWindowsHookEx

**函数功能:**该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.

**函数原形:**HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId ); 

参数:

**idHook:**指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:

WH_CALLWNDPROC(4): 安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程.

**WH_CALLWNDPROCRET(12) :**安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.

**WH_CBT(5) :**安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.

**WH_DEBUG(9):**安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.

**WH_FOREGROUNDIDLE(11):**安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.

**WH_GETMESSAGE(3):**安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.

**WH_JOURNALPLAYBACK(1):**安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.

**WH_JOURNALRECORD(0):**安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.

**WH_KEYBOARD(2):**安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.

**WH_KEYBOARD_LL(13):**此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.

**WH_MOUSE(7):**安装一个挂钩处理过程,对鼠标消息进行监视.  详情参见 MouseProc挂钩处理过程.

**WH_MOUSE_LL(14):**此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.

**WH_MSGFILTER(-1):**安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.

**WH_SHELL(10):**安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.

**WH_SYSMSGFILTER(6):**安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.

**lpfn:**指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程.

**hMod:**指示了一个动态链接的句柄,该动态连接库包含了参数lpfn   所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0).

**dwThreadId:**指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关.

**返回值:**若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError函数.

**备注:**若参数hMod为NULL,而参数dwThreadld为0或者指示了一个其他进程创建的线程标识符,则会产生错误.

对函数CallNextHookEx进行调用以下链接下一个挂钩处理过程是可选的,但也是被推荐的否则,其他安装了此挂钩的应用程序将无法获得此挂钩通知,从而可能导致错误的行为.除非您确实希望防止其他应用程序看到此挂钩通知,您应当调用函数CallNextHookEx.

在终止一个应用程序之前,必须调用函数UnhookWindowsHookEx以释放与此挂钩相关的系统资源.

挂钩的作用域依赖与挂钩的类型.一些挂钩只能被设置成系统作用域,其他挂钩(如下所示)还可以被设置为某一特定线程的作用域:

WH_CALLWNDPROC           线程或系统

WH_CALLWNDPROCRET        线程或系统

WH_CBT                   线程或系统

WH_DEBUG                 线程或系统

WH_FOREGROUNDIDLE        线程或系统

WH_GETMESSAGE            线程或系统

WH_JOURNALPLAYBACK       系统

WH_JOURNALRECORD         系统

WH_KEYBOARD              线程或系统

WH_KEYBOARD_LL           线程或系统

WH_MOUSE                 线程或系统

WH_MOUSE_LL              线程或系统

WH_MSGFILTER             线程或系统

WH_SHELL                 线程或系统

WH_SYSMSGFILTER          系统

对于一个特定的挂钩类型,现成的挂钩先被调用,然后才是系统挂钩被调用.

系统挂钩作为共享资源,安装一次就对所用应用程序产生影响.所有的系统挂钩函数必须在库中.系统挂钩应当被限制用于一些特殊用途的应用程序或者用来作为应用程序调试的辅助工具.不再需要挂钩的库应当将相应的挂钩处理过程删除掉.

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

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,库文件,用户自定义.

SysMsgProc

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

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

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

参数:

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

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

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

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

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

若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进行调用,以使得应用程序能够检查和控制在对对话框、消息框、菜单条、滚动条的内部处理过程中产生的,或是由用户按下<Alt+Tab>组合键以激活不同窗口时产生的消息流.

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

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

--------------------------------------------------------------------------------------------------------------------------------------------------------------

WinAPI——SetWindowsHookEx设置钩子说明

提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中.

SetWindowsHookEx(   idHook: Integer;  {钩子类型}   lpfn: TFNHookProc; {函数指针}   hmod: HINST;      {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}   dwThreadId: DWORD  {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子} ): HHOOK;            {返回钩子的句柄; 0 表示失败}

//钩子类型 idHook 选项: WH_MSGFILTER      = -1; {线程级; 截获用户与控件交互的消息} WH_JOURNALRECORD  = 0;  {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录} WH_JOURNALPLAYBACK = 1;  {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列} WH_KEYBOARD        = 2;  {系统级或线程级; 截获键盘消息} WH_GETMESSAGE      = 3;  {系统级或线程级; 截获从消息队列送出的消息} WH_CALLWNDPROC    = 4;  {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生} WH_CBT            = 5;  {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等} WH_SYSMSGFILTER    = 6;  {系统级; 截获系统范围内用户与控件交互的消息} WH_MOUSE          = 7;  {系统级或线程级; 截获鼠标消息} WH_HARDWARE        = 8;  {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息} WH_DEBUG          = 9;  {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子} WH_SHELL          = 10; {系统级或线程级; 截获发向外壳应用程序的消息} WH_FOREGROUNDIDLE  = 11; {系统级或线程级; 在程序前台线程空闲时调用} WH_CALLWNDPROCRET  = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这