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的版本.

转载于:https://www.cnblogs.com/1175429393wljblog/p/5600704.html

WinAPI——钩子函数大全相关推荐

  1. VB Environ系统环境变量函数大全

    Environ ("Windir") 'c:\windows Windows 目录 Environ ("ProgramFiles") 'c:\ProgramFi ...

  2. 用钩子函数实现鼠标动作录制

    在日常的一些操作中,会遇到重复的鼠标动作,类似按键精灵的软件就会成为比较好的助手.这里借助网上查找的资料自己实现了一个简单的鼠标动作录制软件. 完成界面如图: 录制 录制鼠标动作首先需要截获.钩子函数 ...

  3. Qt实现类似金山快译那种鼠标移到上方移动滑出的窗口(钩子函数)

    首先说移到屏幕上方是在windows上操作的,所以必须用到windows自己的api,这里用到了Windows的钩子函数: HHOOK WINAPI SetWindowsHookEx( __in in ...

  4. c语言s开头的函数以及作用,C语言函数大全-s开头-完整版.doc

    C语言函数大全-s开头-完整版 C语言函数大全(s开头) 函数名: sbrk 功能: 改变数据段空间位置 用法: char *sbrk(int incr); 程序例: #include#include ...

  5. Vue2.0 探索之路——生命周期和钩子函数的一些理解

    前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什 ...

  6. 使用钩子函数[4] - 钩子链和 CallNextHookEx 的返回值

    SetWindowsHookEx 函数的第一个参数表示钩子类型, 共有 14 种选择, 前面我们已经用过两种: WH_KEYBOARD.WH_MOUSE. 系统会为每一种类型的钩子建立一个表(那就是 ...

  7. vue 函数 路由跳转_vue路由的钩子函数和跳转

    首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改.一些需要登录才能调整页面的重定向功能. beforeEach主要有3个参数to,from,next. t ...

  8. actived生命周期_vue生命周期钩子函数actived没有执行

    调用actived钩子函数,发现代码没有执行.......为何vue 背景技术选型:vue+vue-router+vuex 第一步:路由配置文件设置keepAlive=truevue-router / ...

  9. vue函数如何调用其他函数?_从源码中学Vue(一)生命周期中的钩子函数的那点事儿...

    欢迎来到我的<从源码中学Vue>专题系列文章,更多精彩内容持续更新中,欢迎关注 :) Vue作为当下前端最流行的框架之一,在国内占绝对的优势.所以接下来我们一起来学习它吧! 我不会像其它人 ...

最新文章

  1. 主机通过sftp传输文件到某台服务器ubuntu虚拟机出现:open for write: permission denied
  2. 强大的JQuery(三)--操作html与遍历
  3. MATLAB时间序列的排序函数
  4. java icache_Java ICacheWordSubscriber類代碼示例
  5. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)
  6. windows server 2003 32位支持8G内存
  7. 灵魂画手:图解Spring AOP实现原理
  8. 彩虹的七种颜色CMYK和RGB的值是什么
  9. antd组件:Table表格去掉表格边框线,#字类型表格
  10. 为什么选择语音验证码?
  11. ArcEngine编辑模块——批量删除要素
  12. 2.任何一个自然数m的立方均可写成m个连续奇数之和
  13. vip2-day22 MySQL 基础语句
  14. LSTM论文翻译-《Understanding LSTM Networks》
  15. 44 | 答疑(三)
  16. udev (简体中文)
  17. 阿里孤尽:Code Review 是一场苦涩但有意思的修行
  18. proxycap不错
  19. 宋晓丽20190919-3 效能分析
  20. 197 上升的温度

热门文章

  1. 你见过使用寿命最长的手机有多少年?
  2. 和女孩子约会,肢体接触是不是不礼貌?
  3. 英伟达发布dpu,或取代cpu,宣称一个能顶125个
  4. 下一个十年,互联网升级的大致方向在哪里?
  5. 哈斯(Hasse)图
  6. java中的getnumber怎么用_java安全编码指南之:Number操作详解
  7. 数据科学导论_数据科学导论,数据理解和准备
  8. Python数据挖掘-词频统计-实现
  9. 1619. [HEOI2012]采花
  10. Maven创建servlet项目演示(三)