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