WH_CALLWNDPROCRET
WH_CBTWH_DEBUG
WH_FOREGROUNDIDLE
WH_GETMESSAGE
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL
WH_MSGFILTER
WH_SHELL
- HMODULE WINAPI ModuleFromAddress(PVOID pv) //获得钩子函数的地址
- {
- MEMORY_BASIC_INFORMATION mbi;
- if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
- {
- return (HMODULE)mbi.AllocationBase;
- }
- else
- {
- return NULL;
- }
- }
- LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)// 键盘钩子函数消息过程
- {
- if(nCode < 0 || nCode == HC_NOREMOVE)
- return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
- if(lParam & 0x) // 消息重复就交给下一个hook链
- {
- return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
- }
- // 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
- ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam); //发送自定义键盘消息
- return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
- }
- BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)// 安装、卸载钩子的函数
- {
- BOOL bOk;
- g_hWndCaller = hWndCaller;
- if(bInstall)
- {
- g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc,
- ModuleFromAddress(KeyHookProc), dwThreadId); //安装键盘钩子
- bOk = (g_hHook != NULL);
- }
- else
- {
- bOk = ::UnhookWindowsHookEx(g_hHook);
- g_hHook = NULL;
- }
- return bOk;
- }
- LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)//鼠标钩子处理过程
- {
- if(nCode < 0 || nCode == HC_NOREMOVE)
- return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
- ::PostMessage(g_hWndCaller, HM_MOUSE, wParam, lParam);//发送自定义鼠标消息
- return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
- }
- BOOL WINAPI SetMouseHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
- {
- BOOL bOk;
- g_hWndCaller = hWndCaller;
- if(bInstall)
- {
- g_hMouseHook = ::SetWindowsHookEx(WH_MOUSE, MouseProc,
- ModuleFromAddress(MouseProc),dwThreadId); //安装鼠标钩子
- bOk = (g_hMouseHook != NULL);
- }
- else
- {
- bOk = ::UnhookWindowsHookEx(g_hMouseHook);
- g_hMouseHook = NULL;
- }
- return bOk;
- }
HMODULE WINAPI ModuleFromAddress(PVOID pv) //获得钩子函数的地址 { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)// 键盘钩子函数消息过程 { if(nCode < 0 || nCode == HC_NOREMOVE) return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); if(lParam & 0x) // 消息重复就交给下一个hook链 { return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); } // 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息 ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam); //发送自定义键盘消息 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); } BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)// 安装、卸载钩子的函数 { BOOL bOk; g_hWndCaller = hWndCaller; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, ModuleFromAddress(KeyHookProc), dwThreadId); //安装键盘钩子 bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; } LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)//鼠标钩子处理过程 { if(nCode < 0 || nCode == HC_NOREMOVE) return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam); ::PostMessage(g_hWndCaller, HM_MOUSE, wParam, lParam);//发送自定义鼠标消息 return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam); } BOOL WINAPI SetMouseHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller) { BOOL bOk; g_hWndCaller = hWndCaller; if(bInstall) { g_hMouseHook = ::SetWindowsHookEx(WH_MOUSE, MouseProc, ModuleFromAddress(MouseProc),dwThreadId); //安装鼠标钩子 bOk = (g_hMouseHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hMouseHook); g_hMouseHook = NULL; } return bOk; }
- long CHookAppDlg::OnHookKey(WPARAM wParam, LPARAM lParam)
- {
- // 此时参数wParam为用户按键的虚拟键码,
- // lParam参数包含按键的重复次数、扫描码、前一个按键状态等信息
- char szKey[80];
- ::GetKeyNameText(lParam, szKey, 80); //获得按键名
- CString strItem;
- strItem.Format("用户按键:%s", szKey);
- CListBox *pListCtrl=((CListBox *)this->GetDlgItem(IDC_LIST1));
- pListCtrl->InsertString(-1,strItem);
- CFile MyFile;
- char *content;
- if(!MyFile.Open(this->MyDocumentDir,
- CFile::modeRead | CFile::modeWrite))
- {
- MyFile.Open(this->MyDocumentDir,
- CFile::modeCreate);
- return 0;
- }
- MyFile.SeekToEnd(); //移动记录指针到末尾
- pListCtrl->GetText(pListCtrl->GetCount()-1,strItem);
- content=strItem.GetBuffer(MAX_PATH);
- MyFile.Write(content,strItem.GetLength());
- CTime today=CTime::GetCurrentTime();
- CString str=today.Format("/t/t%Y年%m月%d日 %H:%M:%S/r/n");
- MyFile.Write(str.GetBuffer(str.GetLength()),str.GetLength());
- MyFile.Close();
- return 0;
- }
- long CHookAppDlg::OnHookMouse(WPARAM wParam, LPARAM lParam)
- {
- LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam;
- CString strItem,strText;
- CListBox *pListCtrl=((CListBox *)this->GetDlgItem(IDC_LIST1));
- CPoint point;
- ::GetCursorPos(&point);
- ClientToScreen(&point);
- CWnd *pWnd=CWnd::GetForegroundWindow();
- if(pWnd)
- {
- char str[80];
- pWnd->GetWindowText(str,80);
- strText.Format("窗口:%s",str);
- }
- CString str;
- /*CString tempstr;
- // ClientToScreen(&pMouseHook->pt);
- int x,y;
- x=pMouseHook->pt.x;
- y=pMouseHook->pt.y;
- tempstr.Format("X=%d,Y=%d",x,y);
- strText+=tempstr;*/
- if(wParam==WM_RBUTTONDOWN)
- {
- str.Format(" 右键单击:位置 X=%d,Y=%d",point.x,point.y);
- strText+=str;
- pListCtrl->InsertString(-1,strText);
- this->SaveToFile(strText,pListCtrl);
- }
- if(wParam==WM_LBUTTONDBLCLK)
- {
- ScreenToClient(&point);
- str.Format(" 左键双击:位置 X=%d,Y=%d",point.x,point.y);
- strText+=str;
- pListCtrl->InsertString(-1,strText);
- this->SaveToFile(strText,pListCtrl);
- }
- if(wParam==WM_LBUTTONDOWN)
- {
- str.Format(" 左键单击:位置 X=%d,Y=%d",point.x,point.y);
- //MessageBox(strText);
- strText+=str;
- pListCtrl->InsertString(-1,strText);
- this->SaveToFile(strText,pListCtrl);
- }
- return 0;
- }
- void CHookAppDlg::SaveToFile(CString strText,CListBox *pListCtrl)
- {
- char *content;
- CFile MyFile;
- if(!MyFile.Open(this->MyDocumentDir,
- CFile::modeRead | CFile::modeWrite))
- {
- MyFile.Open(this->MyDocumentDir,
- CFile::modeCreate);
- pListCtrl->InsertString(-1,"失败");
- return;
- }
- MyFile.SeekToEnd();
- content=strText.GetBuffer(strText.GetLength());
- MyFile.Write(content,strText.GetLength());
- CTime today=CTime::GetCurrentTime();
- CString strTime=today.Format("/t/t%Y年%m月%d日 %H:%M:%S/r/n");
- MyFile.Write(strTime.GetBuffer(strTime.GetLength()),strTime.GetLength());
- MyFile.Close();
- }
long CHookAppDlg::OnHookKey(WPARAM wParam, LPARAM lParam) { // 此时参数wParam为用户按键的虚拟键码, // lParam参数包含按键的重复次数、扫描码、前一个按键状态等信息 char szKey[80]; ::GetKeyNameText(lParam, szKey, 80); //获得按键名 CString strItem; strItem.Format("用户按键:%s", szKey); CListBox *pListCtrl=((CListBox *)this->GetDlgItem(IDC_LIST1)); pListCtrl->InsertString(-1,strItem); CFile MyFile; char *content; if(!MyFile.Open(this->MyDocumentDir, CFile::modeRead | CFile::modeWrite)) { MyFile.Open(this->MyDocumentDir, CFile::modeCreate); return 0; } MyFile.SeekToEnd(); //移动记录指针到末尾 pListCtrl->GetText(pListCtrl->GetCount()-1,strItem); content=strItem.GetBuffer(MAX_PATH); MyFile.Write(content,strItem.GetLength()); CTime today=CTime::GetCurrentTime(); CString str=today.Format("/t/t%Y年%m月%d日 %H:%M:%S/r/n"); MyFile.Write(str.GetBuffer(str.GetLength()),str.GetLength()); MyFile.Close(); return 0; } long CHookAppDlg::OnHookMouse(WPARAM wParam, LPARAM lParam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; CString strItem,strText; CListBox *pListCtrl=((CListBox *)this->GetDlgItem(IDC_LIST1)); CPoint point; ::GetCursorPos(&point); ClientToScreen(&point); CWnd *pWnd=CWnd::GetForegroundWindow(); if(pWnd) { char str[80]; pWnd->GetWindowText(str,80); strText.Format("窗口:%s",str); } CString str; /*CString tempstr; // ClientToScreen(&pMouseHook->pt); int x,y; x=pMouseHook->pt.x; y=pMouseHook->pt.y; tempstr.Format("X=%d,Y=%d",x,y); strText+=tempstr;*/ if(wParam==WM_RBUTTONDOWN) { str.Format(" 右键单击:位置 X=%d,Y=%d",point.x,point.y); strText+=str; pListCtrl->InsertString(-1,strText); this->SaveToFile(strText,pListCtrl); } if(wParam==WM_LBUTTONDBLCLK) { ScreenToClient(&point); str.Format(" 左键双击:位置 X=%d,Y=%d",point.x,point.y); strText+=str; pListCtrl->InsertString(-1,strText); this->SaveToFile(strText,pListCtrl); } if(wParam==WM_LBUTTONDOWN) { str.Format(" 左键单击:位置 X=%d,Y=%d",point.x,point.y); //MessageBox(strText); strText+=str; pListCtrl->InsertString(-1,strText); this->SaveToFile(strText,pListCtrl); } return 0; } void CHookAppDlg::SaveToFile(CString strText,CListBox *pListCtrl) { char *content; CFile MyFile; if(!MyFile.Open(this->MyDocumentDir, CFile::modeRead | CFile::modeWrite)) { MyFile.Open(this->MyDocumentDir, CFile::modeCreate); pListCtrl->InsertString(-1,"失败"); return; } MyFile.SeekToEnd(); content=strText.GetBuffer(strText.GetLength()); MyFile.Write(content,strText.GetLength()); CTime today=CTime::GetCurrentTime(); CString strTime=today.Format("/t/t%Y年%m月%d日 %H:%M:%S/r/n"); MyFile.Write(strTime.GetBuffer(strTime.GetLength()),strTime.GetLength()); MyFile.Close(); }
上面的代码就是实现将鼠标消息和键盘消息的操作消息添加到一个列表框中和记录到一个文件上的代码.其中this->MyDocumentDir是你要将操作消息记录到的文件路径.
这是鼠标和键盘消息的监听代码,你也可以为应用程序安装其他类型的钩子.
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177799.html原文链接:https://javaforall.net
