用钩子机制实现键盘监听—键盘监听器
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。本文在VC6编程环境下实现了一个简易的键盘监听器,并对Win32全局钩子的运行机制。
废话不多说,先上程序代码及实现过程
第一部分:创建动态链接库
1、创建一个 MFC AppWizard(DLL) 工程 命名为 MyHook;
2、选择MFC Extension DLL(共享MFC拷贝)类型;
3、由于VC 6.0是没有现成的钩子类,所以我们要创建一个钩子类
点击 文件->新建->C/C++ Header File,命名为CMyHook,点击 确定,生成CMyHook.h文件;
4、打开CMyHook.h文件,写入钩子类,如下:
CMyHook.h
class AFX_EXT_CLASS CMyHook : public CObject
{
public:
CMyHook(); //构造函数
virtual ~CMyHook(); //析构函数
public:
BOOL StartHook(); //安装钩子
BOOL StopHook(); //卸载钩子
};
5、打开MyHook.cpp文件,在顶部加入:#include “CMyHook.h”
6、在MyHook.cpp文件中加入全局共享数据段,如下:
#pragma data_seg("mydata")
HHOOK glhHook=NULL; //安装globle勾子句柄
HINSTANCE glhInstance=NULL; //DLL实例句柄
#pragma data_seg()
7、定义数据段mydata,工程-> 设置-> 连接-> 工程 选项-> 加入语句:/SECTION:mydata,rws
8、在MyHook.cpp的DLLMain函数中加入语句: glhInstance=hInstance;//插入保存DLL实例句柄
如下:
.....
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("MYHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(MyHookDLL, hInstance))
return 0;
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.
new CDynLinkLibrary(MyHookDLL);
glhInstance=hInstance;//插入保存DLL实例句柄
}
else