C++ Builder实现MessageBox拦截

原创 2015年11月20日 18:30:21

MessageBox分为MessageBoxA和MessageBoxW两种方法,若要完全拦截MessageBox需要实现两个方法;

基本原理可以参考下面的博客:

http://blog.csdn.net/friendan/article/details/12224481

这篇文章是在C++Builder 6环境下实现APIHOOK拦截MessageBox

界面如下:


开始按钮:加载鼠标钩子

结束按钮:卸载鼠标钩子

调用MessageBoxA:调用一个自己写的MessageBoxA

调用MessageBoxW:调用一个自己写的MessageBoxW

未安装钩子前:



安装钩子后:



下面说一下代码:

测试界面要注意的是如何调用MessageBoxW,第二个参数和第三个参数均为wchar_t *,所以需要做一次转换

char *CStr = "正常的MessageBoxW";
    int len = MultiByteToWideChar(CP_ACP,0,CStr,strlen(CStr),NULL,0);
    wchar_t* m_wchar = new wchar_t[len+1];
    MultiByteToWideChar(CP_ACP,0,CStr,strlen(CStr),m_wchar,len);
    m_wchar[len] = '\0';


    char *CStr1 = "提示对话框二";
    int len1 = MultiByteToWideChar(CP_ACP,0,CStr1,strlen(CStr),NULL,0);
    wchar_t* m_wchar1 = new wchar_t[len1+1];
    MultiByteToWideChar(CP_ACP,0,CStr1,strlen(CStr),m_wchar1,len1);
    m_wchar1[len1] = '\0';


    MessageBoxW(Handle,m_wchar,m_wchar1,MB_OK);


DLL结构如下:


定义了一个THookClass通用类,可以通过API陷入方式实现拦截,这样就不需要重复写多个方法分别实现MessageBoxA和MessageBoxW了。

class THookClass{
private:
    HANDLE hProcess;
    bool AreadlyHook;
    BYTE Oldcode[5];//保存API入口处代码
    BYTE Newcode[5];//JMP XXXX
    DWORD IdOld,IdNew;
public:
    FARPROC OldFunction,NewFunction;
    THookClass(){};
    THookClass(FARPROC OldFun,FARPROC NewFun);
    ~THookClass();
    void Restore();//停止HOOK
    void Change();//开始HOOK
};

源码下载地址:http://pan.baidu.com/s/1o6xSzOY


发现代码有问题,之前拦截的MessageBoxA消息仅限于本进程,根本不是全局的,修改了一下代码可以拦截全局MessageBox消息

源码下载如下:http://pan.baidu.com/s/1ntivCG5

使用C++builder打开代码重新编译时可能会报错


提示无法加载THookClass,这里可以打开项目的路径信息:


在Include path路径下无法加载到THookClass,没什么好的办法,新建一个项目把代码拷过去或者可以试试把THookClass.cpp文件考到上述中某个文件夹下面试试。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++Builder中MessageBox的基本用法

【函数】 MessageBox( Text, Title, nType);【函数说明】 弹出一个消息框。【语法】参数:Text ,消息框的正文;Title ,消息框的标题;nType ,消息框的...

C++Builder中MessageBox的基本用法

【函数】 MessageBox( Text, Title, nType); 【函数说明】 弹出一个消息框。 【语法】 参数: Text ,消息框的正文; Title ,消息框的标题; ...
  • ujn304
  • ujn304
  • 2011-10-18 20:47
  • 2242

几种创建型的设计模式概析【下】——Builder模式,ProtoType模式【C++实现】

Bulider模式和AbstractFactory模式在功能上有些相似,都是负责管理创建复杂对象的组件。与AbstractFactory模式不同的是,Builder模式是将一个对象的创建分成几个小部分...

C++实现Creational - Builder模式

在软件系统中,有时候面临着一个复杂对象的创建工作,该复杂对象通常由各个部分的子对象用一定的算法构成。由于需求的变化,这个复杂对象的各个子对象经常面临着剧烈的变化,但是将这些子对象组合在一起的算法是相对...

设计模式 - 建造者模式(Builder) C++实现

生成器模式(Builder) 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

常见设计模式的解析和实现(C++)之三-Builder模式

作用: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 UML结构图: 适用于以下情况: 1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装...

设计模式的解析和实现(C++)之三-Builder模式

作用:     将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。     UML结构图:     适用于以下情况:     1)当创建复杂对象...

利用C++ Builder实现网络连接检测程序(转)

在Windows系统中,我们经常用Ping.exe来测试 在Windows系统中,我们经常用Ping.exe来测试网络的连通性。  Ping的实现过程很简单,该命令将引发IP层发送一个简单的IP包,一...

C++ Builder下三种UDP通信实现方法的比较

1.NMUDP控件    这个控件使用起来比较简单,设定监听端口,然后响应DataReceived事件就可以了,例如: void __fastcall TMoniter::NMUDPDataRecei...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)