VC通过dll实现鼠标钩子的方法

2014-07-10 22:12:59|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 操作系统|来源:唯设编程网

Win7环境使用VC2008编写DLL实现鼠标钩子这篇文章中介绍了如何在VC环境中编写一个鼠标钩子程序,但是,通常我们需要将钩子封装在一个dll动态链接库中,本文介绍另一种在dll动态链接库中实现一个这样的钩子的方法。

1.MouseHookLib.def文件声明

按照Win7环境使用VC2008编写DLL实现鼠标钩子这篇文章中介绍的方法,先创建一个类型为dll的工程,命名为MouseHookLib,在自动生成的MouseHookLib.def文件中使用SECTIONS生命一块内存空间,最终该文件如下:

; MouseHookLib.def : 声明 DLL 的模块参数。

LIBRARY      "MouseHookLib"

EXPORTS
    ; 此处可以是显式导出
SECTIONS
	mydata READ WRITE SHARED

其中的mydata声明了一块可读写的共享内存,可以实现与其它程序共享变量。

2.创建CMouseHook类

新建一个类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;
}

3.定义全局变量

在共享内存区定义了三个全局变量:glhInstance用来保存dll的实例句柄,glhRecWnd用来保存接收消息的窗口句柄,glhHook用来保存安装的鼠标钩子句柄。

///////////////////////////////
#pragma  data_seg("mydata")
//DLL实例句柄
HINSTANCE glhInstance = NULL;
//接收消息的窗口句柄
HWND glhRecWnd = NULL;
//安装的鼠标钩子句柄
HHOOK glhHook = NULL;
#pragma data_seg()
///////////////////////////////

 

<123>
发表评论0条 】
网友评论(共?条评论)..
VC通过dll实现鼠标钩子的方法