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

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

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

为了保证钩子在类销毁时得到释放,还需要在析构函数中调用StopHook函数:

CMouseHook::~CMouseHook()
{
	StopHook();
}

到此,一个完整的鼠标钩子dll动态链接库就定义完成了,下面介绍如何使用。

5.鼠标钩子使用

在一个继承自CDialog的类中使用上面定义的鼠标钩子,首先构造一个鼠标钩子并存储在类的成员变量中,然后调用StartHook启动钩子:

       //构造一个鼠标钩子
	m_pMouseHook = CMouseHook::CreateInstance();
	//激活钩子
	m_pMouseHook->StartHook(this->GetSafeHwnd());

然后定义鼠标钩子消息映射:

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

鼠标钩子消息响应函数如下:

// 响应鼠标钩子的消息函数
LRESULT CHookTestAppDlg::OnMouseHook(WPARAM wParam, LPARAM lParam)
{
	HWND hwndTarget = (HWND)(wParam);
	//停止鼠标钩子
	if(m_pMouseHook != NULL){
		m_pMouseHook->Release();
		m_pMouseHook = NULL;
	}

	CString strTip;
	WCHAR str[200] = {0};

	//控件句柄没有改变
	if(hwndTarget == m_hwndTarget)
		return -1;

	//1. 控件信息
	//控件标题
	::GetWindowText(hwndTarget,str,200);
	GetDlgItem(IDC_TITLE)->SetWindowText(str);
	//控件类名
	::GetClassName(hwndTarget,str,200);
	GetDlgItem(IDC_CLASSNAME)->SetWindowText(str);
	//控件句柄
	strTip.Format(_T("0x%x"),hwndTarget);
	GetDlgItem(IDC_HWND)->SetWindowText(strTip);

	//保持控件句柄
	m_hwndTarget = hwndTarget;	
	
	//查询窗口句柄
	HWND hwndWind = m_hwndTarget;
	while(hwndWind != NULL){
		m_hwndWind = hwndWind;
		hwndWind = ::GetParent(hwndWind);
	}

	//2. 窗口信息
	//窗体标题
	::GetWindowText(m_hwndWind, str, 200);
	GetDlgItem(IDC_WINTITLE)->SetWindowText(str);
	//窗体类名
	::GetClassName(m_hwndWind, str, 200);
	GetDlgItem(IDC_WINCLASSNAME)->SetWindowText(str);
	//窗体句柄
	strTip.Format(_T("0x%x"),m_hwndWind);
	GetDlgItem(IDC_WINHANDLE)->SetWindowText(strTip);

	//3. 位置信息
	POINT pt = {LOWORD(lParam),HIWORD(lParam)};
	//鼠标位置(屏幕)
	strTip.Format(_T("%d,%d"),pt.x,pt.y);
	GetDlgItem(IDC_SCREENPOS)->SetWindowText(strTip);
	//鼠标位置(窗体)
	::ScreenToClient(m_hwndWind,&pt);
	strTip.Format(_T("%d,%d"),pt.x,pt.y);
	GetDlgItem(IDC_WINPOS)->SetWindowText(strTip);

	//4. 显示进程信息
	this->ShowProcessInfo(m_hwndWind);

	//隐藏提示信息
	GetDlgItem(IDC_STATICTIP)->ShowWindow(SW_HIDE);

	return LRESULT();
}

该函数的主要功能是获取鼠标点击窗口对应的相关信息,包括窗口句柄,窗口标题,窗体类名,鼠标的屏幕坐标和窗口左边,还有与窗口对应的进程信息。

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