安装和释放挂钩过程

【勇芳软件工作室】汉化HomePreviousNext

您可以通过调用SetWindowsHookEx函数并指定调用该过程的钩子类型来安装钩子过程,不管该过程是否与所有线程或特定线程相关联,以及指向过程入口点的指针。

您必须将DLL中的全局钩子程序放在与安装钩子过程的应用程序分开的DLL中。安装应用程序必须具有DLL模块的句柄才能安装挂钩过程。LoadLibrary函数在给定DLL的名称时返回DLL模块的句柄。手柄完成后,您可以调用GetProcAddress函数来检索挂钩过程的地址。最后,您使用SetWindowsHookEx在相应的挂钩链中安装挂钩过程地址。SetWindowsHookEx传递模块句柄,指向挂钩过程入口点的指针,线程标识符为0,表示挂接过程应与系统中的所有线程相关联。此序列显示在以下示例中。

HOOKPROC hkprcSysMsg;

static HINSTANCE hinstDLL;

static HHOOK hhookSysMsg;

hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");

hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");

hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,

hkprcSysMsg, hinstDLL, 0);

您可以通过调用UnhookWindowsHookEx函数来释放线程特定的钩子过程(从挂钩链中删除其地址),指定要释放的挂钩过程的句柄。一旦您的应用程序不再需要,就释放一个挂钩程序。

您可以使用UnhookWindowsHookEx释放全局挂钩过程,但此函数不能释放包含挂钩过程的DLL。这是因为在系统中每个应用程序的进程上下文中调用全局钩子过程,导致对所有这些进程的LoadLibrary函数的隐式调用。因为不能为另一个进程调用FreeLibrary函数,所以没有办法释放DLL。显式链接到DLL的所有进程终止或调用FreeLibrary之后,Windows最终释放DLL,所有调用挂接过程的进程都已恢复到DLL外的处理。

安装全局钩子过程的另一种方法是在DLL中提供安装功能以及挂钩过程。使用这种方法,安装应用程序不需要DLL模块的句柄。通过与DLL链接,应用程序可以访问安装功能。安装功能可以在调用SetWindowsHookEx中提供DLL模块句柄和其他详细信息。DLL还可以包含一个释放全局钩子过程的函数;当终止时,应用程序可以调用这个挂钩释放功能。