消息钩子使用教程

豆豆网   技术应用频道   2006年12月01日  【字号: 收藏本文

本文详细介绍消息钩子使用教程

  Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

  钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

  钩子子程必须按照以下的语法

  :LRESULT CALLBACK HookProc
(
  int nCode,
     WPARAM wParam,
     LPARAM lParam
);
HookProc是应用程序定义的名字。

  nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。

  wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。

  2、钩子的安装与释放:

  使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数。

HHOOK SetWindowsHookEx(
     int idHook,   // 钩子的类型,即它处理的消息类型
     HOOKPROC lpfn,  // 钩子子程的地址指针。如果dwThreadId参数为0
        // 或是一个由别的进程创建的线程的标识,
        // lpfn必须指向DLL中的钩子子程。
        // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
        // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
     HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的
DLL。
        // 如果dwThreadId 标识当前进程创建的一个线程,
        // 而且子程代码位于当前进程,hMod必须为NULL。
        // 可以很简单的设定其为本应用程序的实例句柄。
     DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
        // 如果为0,钩子子程与所有的线程关联,即为全局钩子。
           );
  函数成功则返回钩子子程的句柄,失败返回NULL。

作者:姜山    责编:豆豆技术应用

正在加载评论...