2014-07-10 22:12:59|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 操作系统|来源:唯设编程网
为了保证钩子在类销毁时得到释放,还需要在析构函数中调用StopHook函数:
CMouseHook::~CMouseHook()
{
StopHook();
}
到此,一个完整的鼠标钩子dll动态链接库就定义完成了,下面介绍如何使用。
在一个继承自CDialog的类中使用上面定义的鼠标钩子,首先构造一个鼠标钩子并存储在类的成员变量中,然后调用StartHook启动钩子:
//构造一个鼠标钩子
m_pMouseHook = CMouseHook::CreateInstance();
//激活钩子
m_pMouseHook->StartHook(this->GetSafeHwnd());
然后定义鼠标钩子消息映射:

鼠标钩子消息响应函数如下:
// 响应鼠标钩子的消息函数
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();
}
该函数的主要功能是获取鼠标点击窗口对应的相关信息,包括窗口句柄,窗口标题,窗体类名,鼠标的屏幕坐标和窗口左边,还有与窗口对应的进程信息。