还有一点要注意:系统挂钩必须放在单独的动态链接库中。因此,该程序分为两部分:一是钩子程序动态链接库,它实现了鼠标钩子程序。另一个是MFC操作窗口,它会加载和卸载DLL,即测试DLL。

新项目-> Visual C ++-> MFC DLL
// 自定义消息 #define WM_HOOKMSG WM_USER + 106
/* 共享代码段,所有线程共享 */ #pragma data_seg("SHARED") static HHOOK hhkMouse = NULL; // 鼠标钩子句柄 static HINSTANCE g_hInstance = NULL; // 本DLL的实例句柄 static HWND g_hWnd = NULL; // 调用DLL的主窗口句柄 #pragma data_seg() #pragma comment(linker,"/section:SHARED,rws")
/* 定义低级鼠标子函数 */ LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam){ // 有鼠标消息时,将其发给主程序 if ( g_hWnd != NULL && nCode == HC_ACTION) { ::SendMessage(g_hWnd,WM_HOOKMSG,wParam,lParam); } return CallNextHookEx(hhkMouse,nCode,wParam,lParam); }
/* 安装低级鼠标子函数,从而截获系统所有的鼠标信息 */ BOOL WINAPI StartHookMouse(HWND hwnd){ g_hWnd = hwnd; hhkMouse = SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,g_hInstance,0); if ( NULL == hhkMouse) { return FALSE; } else{ return TRUE; } }
/* 卸载低级鼠标钩子 */ VOID WINAPI StopHookMouse(){ if (hhkMouse != NULL) { ::UnhookWindowsHookEx(hhkMouse); } }
/* 获取自身 DLL 句柄 */ BOOL ChookDllApp::InitInstance(){ CWinApp::InitInstance(); g_hInstance = ::AfxGetInstanceHandle(); return TRUE; }
hookDll.def文件,hook的加载和卸载功能:
; hookDll.def : 声明 DLL 的模块参数。 LIBRARY "MouseHook" EXPORTS ; 此处可以是显式导出 StartHookMouse StopHookMouse
/* 消息定义 */ #define WM_MOUSEMSG WM_USER + 106
/* 添加消息映射 */ BEGIN_MESSAGE_MAP(ChookWindowDlg, CDialogEx) //…… …… ON_MESSAGE(WM_MOUSEMSG,&ChookWindowDlg::OnMouseMsg) //消息映射 END_MESSAGE_MAP()
/* 鼠标钩子的加载和卸载 */ HINSTANCE g_hInstanceDll = NULL; // 启动鼠标钩子 void ChookWindowDlg::OnBnClickedButtonStart(){ // TODO: 在此添加控件通知处理程序代码 g_hInstanceDll = LoadLibrary(_T("hookDll.dll")); if (NULL == g_hInstanceDll){ AfxMessageBox(_T("加载hookDll.dll失败")); return; } typedef BOOL (CALLBACK *StartHookMouse)(HWND hwnd); StartHookMouse startHook; startHook = (StartHookMouse) ::GetProcAddress(g_hInstanceDll,"StartHookMouse"); if ( NULL == startHook ){ AfxMessageBox(_T("获取 StartHookMouse 函数失败")); return; } if (startHook(this->m_hWnd)) { m_List.InsertItem(m_List.GetItemCount(),_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,2,_T("启动鼠标钩子成功")); } else{ m_List.InsertItem(m_List.GetItemCount(),_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,2,_T("启动鼠标钩子失败")); } } // 停止鼠标钩子HOOK void ChookWindowDlg::OnBnClickedButtonHook(){ // TODO: 在此添加控件通知处理程序代码 typedef VOID (CALLBACK *StopHookMouse)(); StopHookMouse stopHook; g_hInstanceDll = LoadLibrary(_T("hookDll.dll")); if ( g_hInstanceDll == NULL) { AfxMessageBox(_T("加载DLL失败")); return; } stopHook = (StopHookMouse) ::GetProcAddress(g_hInstanceDll,"StopHookMouse"); if (stopHook == NULL){ m_List.InsertItem(m_List.GetItemCount(),_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,2,_T("获取函数 StopHookMouse 失败")); return; }else{ stopHook(); m_List.InsertItem(m_List.GetItemCount(),_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0")); m_List.SetItemText(m_List.GetItemCount()-1,2,_T("停止HOOKMOUSE成功")); } if (g_hInstanceDll != NULL){ ::FreeLibrary(g_hInstanceDll); } // 确保list control 最后一行可见 m_List.EnsureVisible(m_List.GetItemCount()-1,FALSE); }


源代码
地址:
文件:MouseHook
参考
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-321890-2.html
它就是在展示一个“警告中国”的姿态
宋茜也美美的@在法家拿到五冠王的瓦片