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() ///////////////////////////////