2024年3月28日发(作者:)

系统钩子和DLL

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的

种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出, 在到达目的窗

口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对

截获的消息进行加工处理,甚至可以强制结束消息的传递。

在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截

整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行 封装,VC6中

有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态

链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及

Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC

DLL。

键盘钩子程序示例

本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库

LaunchDLL。首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked

to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库。

之后,在相应的头文件中添加宏定义和待导出函数的声明:

#define DllExport __declspec(dllexport)

……

DllExport void WINAPI InstallLaunchEv();

……

class CLaunchDLLApp : public CWinApp

{

public:

CLaunchDLLApp();

//{{AFX_VIRTUAL(CLaunchDLLApp)

//}}AFX_VIRTUAL

//{{AFX_MSG(CLaunchDLLApp)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()