2014-07-10 22:12:59|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 操作系统|来源:唯设编程网
在Win7环境使用VC2008编写DLL实现鼠标钩子这篇文章中介绍了如何在VC环境中编写一个鼠标钩子程序,但是,通常我们需要将钩子封装在一个dll动态链接库中,本文介绍另一种在dll动态链接库中实现一个这样的钩子的方法。
按照Win7环境使用VC2008编写DLL实现鼠标钩子这篇文章中介绍的方法,先创建一个类型为dll的工程,命名为MouseHookLib,在自动生成的MouseHookLib.def文件中使用SECTIONS生命一块内存空间,最终该文件如下:
; MouseHookLib.def : 声明 DLL 的模块参数。
LIBRARY "MouseHookLib"
EXPORTS
; 此处可以是显式导出
SECTIONS
mydata READ WRITE SHARED
其中的mydata声明了一块可读写的共享内存,可以实现与其它程序共享变量。
新建一个类CMouseHook,用来启动鼠标钩子(StartHook)和停止鼠标钩子(StopHook),以及实现钩子的回调函数,该类的声明如下:
#pragma once
#define WM_MOUSEHOOK_MESSAGE (WM_USER + 100)
// CMouseHook 命令目标
class AFX_CLASS_EXPORT CMouseHook : public CObject
{
public:
CMouseHook();
virtual ~CMouseHook();
//
BOOL StartHook(HWND hWnd);
BOOL StopHook();
//在其它模块无法销毁dll中的资源,所以设计下面两个函数
//用来创建和销毁资源
static CMouseHook* CreateInstance();
void Release();
};
其中的CreateInstance和Release分别用来创建和销毁钩子实例,之所以需要这样做,是因为在其它模块无法销毁dll中的资源,这两个函数的定义如下:
CMouseHook* CMouseHook::CreateInstance(){
return new CMouseHook();
}
void CMouseHook::Release(){
delete this;
}
在共享内存区定义了三个全局变量:glhInstance用来保存dll的实例句柄,glhRecWnd用来保存接收消息的窗口句柄,glhHook用来保存安装的鼠标钩子句柄。
///////////////////////////////
#pragma data_seg("mydata")
//DLL实例句柄
HINSTANCE glhInstance = NULL;
//接收消息的窗口句柄
HWND glhRecWnd = NULL;
//安装的鼠标钩子句柄
HHOOK glhHook = NULL;
#pragma data_seg()
///////////////////////////////