非MFC工程实现消息映射

MFC中消息映射实例 1、MFC中用DECLARE_MESSAGE_MAP宏声明消息映射函数; 2、MFC中用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏实现消息映射; 3、每个MFC应用程序中都存在一个消息响应链表,这个表由DECLARE_MESSAGE_MAP定义,并 由BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏之间的代码填充内容。这样,取得消息后,MFC 阅读详情

在纯 C++ 工程中不能直接使用 MFC 风格的BEGIN_MESSAGE_MAP消息映射
BEGIN_MESSAGE_MAP是 MFC(Microsoft Foundation Classes)中的宏,它是基于 MFC 框架的一种消息映射机制。MFC 是一个 C++ 类库,它对 Windows API 进行了封装,提供了面向对象的编程接口。MFC 中的消息映射机制依赖于 MFC 的框架结构,包括CWnd类、CCmdTarget类等一系列类的层次结构以及它们的内部实现。
纯 C++ 工程没有包含 MFC 的这些类和框架支持,所以编译器无法识别BEGIN_MESSAGE_MAP这些 MFC 特有的宏。
模拟消息映射机制
虽然不能直接使用 MFC 的消息映射,但可以在纯 C++ 工程中模拟类似的机制。
例如,可以使用一个结构体数组或者std::map来存储消息和对应的消息处理函数指针。
下面是一个简单的使用结构体数组模拟消息映射的示例:

#include <iostream>
#include <windows.h>
#include <map>

// 定义消息处理函数类型
typedef LRESULT(CALLBACK* MessageHandler)(HWND, UINT, WPARAM, LPARAM);

// 全局消息映射表(使用std::map)
std::map<UINT, MessageHandler> messageMap;

// 示例消息处理函数
LRESULT CALLBACK MyMessageHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    std::cout << "Received message: " << message << std::endl;
    return 0;
}

// 自定义的消息处理函数,用于查找并调用对应的消息处理函数
LRESULT CALLBACK ProcessMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    auto it = messageMap.find(message);
    if (it != messageMap.end()) {
        return it->second(hWnd, message, wParam, lParam);
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int main() {
    // 注册消息和处理函数
    messageMap[WM_USER + 1] = MyMessageHandler;

    // 假设这里有窗口句柄hWnd和消息message等参数,调用ProcessMessages进行消息处理
    HWND hWnd = nullptr;
    UINT message = WM_USER + 1;
    WPARAM wParam = 0;
    LPARAM lParam = 0;
    ProcessMessages(hWnd, message, wParam, lParam);

    return 0;
}

非阻塞代码

#include <iostream>
#include <windows.h>
#include <thread>
#include <vector>
#include <map>

// 定义消息处理函数类型
typedef LRESULT(CALLBACK* MessageHandler)(HWND, UINT, WPARAM, LPARAM);

// 全局消息映射表(使用std::map)
std::map<UINT, MessageHandler> messageMap;

// 示例消息处理函数
LRESULT CALLBACK MyMessageHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    std::cout << "Received message: " << message << std::endl;
    return 0;
}

// 消息分发线程函数,用于非阻塞地处理消息
void messageDispatchThread(HWND hWnd) {
    MSG msg;
    while (true) {
        if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else {
            // 当消息队列为空时,可以在这里添加其他非阻塞的操作,比如定时检查等
            // 这里简单休眠一小段时间,避免空转消耗过多CPU资源
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }
}

// 自定义的消息处理函数,用于查找并调用对应的消息处理函数
LRESULT CALLBACK ProcessMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    auto it = messageMap.find(message);
    if (it!= messageMap.end()) {
        return it->second(hWnd, message, wParam, lParam);
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int main() {
    // 注册消息和处理函数
    messageMap[WM_USER + 1] = MyMessageHandler;

    // 创建一个窗口示例(这里简单创建一个隐藏窗口用于演示,实际可根据需求替换)
    const char* className = "MyWindowClass";
    WNDCLASS wc = {};
    wc.lpfnWndProc = ProcessMessages;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = className;
    if (!RegisterClass(&wc)) {
        std::cerr << "窗口类注册失败: " << GetLastError() << std::endl;
        return 1;
    }
    HWND hWnd = CreateWindow(className, "", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, GetModuleHandle(NULL), NULL);
    if (hWnd == NULL) {
        std::cerr << "窗口创建失败: " << GetLastError() << std::endl;
        return 1;
    }
    ShowWindow(hWnd, SW_HIDE);

    // 创建消息分发线程,在该线程中进行非阻塞的消息处理
    std::thread dispatchThread(messageDispatchThread, hWnd);
    dispatchThread.detach();

    // 主线程可以继续执行其他任务,这里简单模拟主线程有其他操作,比如每隔一段时间输出一些信息
    for (int i = 0; i < 10; ++i) {
        std::cout << "主线程正在执行其他任务,当前计数: " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}
MFC 简单的SendMessage子窗口调用主窗口函数(消息映射)的实现 子窗口传递消息给主窗口,SendMessage,简单详细的实现 阅读详情

相关推荐

逆向实战:MFC程序控件消息映射的破解之道

本文深入探讨了MFC程序逆向工程的核心技术——破解控件消息映射。通过实战演示,详细介绍了如何使用SPY++定位窗口句柄,并利用XSPY工具探查MFC内部消息映射表,最终通过编写代码发送特定消息来触发隐藏逻辑。该方法对于安全研究、漏洞挖掘及CTF竞赛(如攻防世界)中的MFC程序分析具有重要价值,提供了一套高效的“黑盒”变“白盒”的逆向实战思路。

game4的博客 658

MFC编程入门级教程

MFC (Microsoft Foundation Classes) 是微软公司专门为C++开发者设计的一套应用程序框架和类库。它通过C++类的形式对Windows API进行了高度封装,简化了Windows应用程序的开发过程。MFC提供了一系列预定义的类,这些类对应于Windows编程中的各种基本元素,如窗口、菜单、对话框、控件等,同时也包含了应用程序框架的支持,如文档/视图体系结构、命令路由、消息映射机制等。

new9232的博客 2万+

Windows逆向学习笔记——MFC原理:RTTI和消息映射 在逆向中的应用

test

weixin_38526180的博客 1337

MFC消息处理函数是怎么映射的

 用MFC的ClassWizard创建的工程,MFC利用几个宏建立了一个消息映射网,把一个消息处理函数和一个ID捆绑起来。至于消息映射网的建立,在侯先生的<深入浅出MFC>中已经解释的很清楚了,在此不说。在看书的时候有一个问题当时没有想明白,它是怎么把一个类的成员函数赋值给一个函数指针的?还有对于带有不同参数类型的成员函数,它是怎么用一个函数指针给统一赋值的?现在看一下在类头文件中用到一个宏是

camvc的专栏 4199

VC++深入详解(2):MFC消息映射与基本绘图

先看一个简单的例子:让程序对鼠标左键响应一个messagebox。 有两种方法完成这个任务:1.在对应的类上选择Add windows message Handler,然后选择WM_LBUTTONDOWN消息,然后增加处理函数,在处理函数中添加一句: MessageBox("view click!");或者使用菜单上的查看->建立类向导,在message maps下选择:Project选

thefutureisour的专栏 4634

告别传统消息映射:Boost.MPL实现高效Windows消息处理

Windows应用程序的核心交互模型基于消息驱动机制,系统通过GetMessage从线程消息队列中获取事件,再经调用目标窗口的窗口过程(Window Procedure)进行分发处理。整个流程构成一个典型的消息循环,支撑着键盘、鼠标、定时器等各类输入响应。在MFC框架中,等宏将消息ID与处理函数关联,形成消息映射表,本质上是通过预处理器展开生成虚函数调用链。该机制虽提升了代码可读性,但存在类型不安全、调试困难和运行时查找开销等问题。// 典型MFC消息映射片段。

weixin_42497762的博客 652

MFC基础入门

VS2019中MFC开发入门

Star_ID的博客 1万+

物料主数据管理难在哪?基于AI算法的数据清洗工具了解一下

企企通打造的一套以AI模型和算法为核心的产品及服务,可针对各类企业的不同主数据痛点难点,提供多种解决方案,能够快速完成物料主数据清洗、识别、匹配、梳理,满足一物一码、分类梳理、一品多商、多维度比价、精准寻源选品、建立标准物料库、供应商及客户主数据清洗等业务场景需求。随着AI技术的快速发展,智能算法在数据清洗领域的应用越来越广泛,越来越多的数据清洗工作已经开始交由智能算法完成,通过自动化的方式处理大量数据,识别和纠正错误,填补缺失值,检测异常值,以及执行其他数据预处理任务,并提高效率并减少人为错误。

QQT_qqt的博客 1364

C++消息映射

做工程用到MFC部分,为了加深对这部分的理解,并且可以在适当的时候进行复习,这里转载鸡啄米教程。 什么是消息        窗口消息一般由三个部分组成:1.一个无符号整数,是消息值;(2)消息附带的WPARAM类型的参数;(3)消息附带的LPARAM类型的参数。其实我们一般所说的消息是狭义上的消息值,也就是一个无符号整数,经常被定义为宏。        什么是消息映射机制

xiaolongrenstep的博客 4625

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1483

从零组装一台会‘看’的无人机:手把手教你配置NUC机载电脑与D435深度相机(环境搭建篇)

本文详细介绍了如何从零开始组装一台具备视觉能力的智能无人机,重点讲解了NUC机载电脑与D435深度相机的配置方法。通过Ubuntu系统安装、ROS环境搭建、深度学习框架配置等步骤,帮助开发者实现无人机的自主避障和目标跟踪功能。文章还提供了性能优化和常见问题解决方案,是无人机视觉系统开发的实用指南。

weixin_30915275的博客 397

第四课:MFC画图-MFC消息映射机制的剖析

MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。主要介绍一些绘图方面的知识。程序实例:新建工程

一蓑烟雨的专栏 1548

Swin Transformer 类可视化(grad CAM)

完整代码 from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM from pytorch_grad_cam.utils.image import show_cam_on_image from torchvision.models import resnet50 import glob from demo import parse_option from models i

G果的博客 6639

三、MFC消息映射机制实现原理

3)静态函数创建静态结构体(AFX_MSGMAP),第一个元素为类父类的静态结构体(AFX_MSGMAP)地址,第二个元素为上一步创建的静态结构体(AFX_MSGMAP_ENTRY)数组地址。(4)由静态结构体(AFX_MSGMAP)组成的列表(链表头当前类的结构体(AFX_MSGMAP_ENTRY);(2)静态函数创建静态结构体(AFX_MSGMAP_ENTRY)数组,结构体最后一个元素为消息处理函数。(1)由当前类(申明消息处理的类)获取列表头,遍历获取消息处理函数,然后调用消息处理函数。......

liutit的博客 625

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1170

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1896

【windows核心编程4】MFC结构详解:从工程文件到消息机制全面解析

sln- 解决方案入口.vcxproj- 工程编译配置- 文件结构这三个文件丢失会导致项目「散架」,无法正常打开和编译。.sdf.suo.aps- 辅助文件,VS会自动重建.ncb- 自动完成出问题时可删除重建在Windows系统中,窗口消息是应用程序与操作系统、用户交互的核心通信方式。当用户点击鼠标、按下键盘、调整窗口大小,或系统状态发生变化时,操作系统会向目标窗口发送一条"通知",这就是消息。每个窗口都有一个专属的窗口过程函数(Window Procedure),负责接收并处理这些消息。

云小逸的博客 779

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1344

MFC如何清理和删除一些消息映射函数

平时在做MFC工程时,难免会遇到很多消息没有使用但是却占用了很多地方,我们想删除但是有害怕破坏整个工程的运行,今天就给大家介绍下MFC清理删除消息映射函数的两种方法: 1.手动删除 MFC的消息映射类向导会在三个地方产生相应的代码           1.在.cpp文件中的函数体部分           2.消息映射区域的代码           3.头文件的函数声明 就是这三个地方,

一个早起的程序员 3871

YOLOv11改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 852

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VS2013 MFC 消息映射

0.消息是MFC程序进行通讯的基础,在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。   (1)窗口消息:WM_XXX 窗口消息(Window Message)一般与窗口的内部运作有关,如:创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。   (2)命令消息:WM_COMMAND 命令消息一般与处理用户请求相关,当用户单击一个菜单项或工

BCD_not_CBD的博客 1864

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

027.MFC_映射消息

映射消息MFC中的消息映射宏  DECLARE_MESSAGE_MAP  BEGIN_MEASSAGE_MAP  END_MESSAGE_MAP向导自动映射消息手动添加映射消息 MFC会帮我们自动映射大部分消息,当MFC不能自动映射消息时就需要我们手动映射消息 一、建立名为message的MFC工程,并添加如图组件 1、双击清空-自动button进入messageDlg.cpp...

dat1842的博客 188

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VS2013如何在MFC工程中定义自己的消息映射函数

VS2013环境下,在创建的MFC工程ThreadSendMSG中自定义消息映射函数

没心没肺之熬夜不洗澡 4922

MFC自定义消息的实现方法

这篇文章主要介绍了MFC自定义消息的实现方法,通过该示例可以更好的理解MFC的消息封装机制,以便更加灵活的打造个性化的windows应用程序,需要的朋友可以参考下 一、概述: 消息机制是windows程序的典型运行机制,在MFC中有很多已经封装好了的消息,如WM_BTN**等。但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能,这时候MFC的向导不能帮助我们做到这

u013178558的专栏 1155

MFC之消息映射机制实现方法

本文分析了完成消息映射的的应有步骤以及消息映射机制的原理性分析。

Keep Moving~ 4210
上一篇: 机器视觉和计算机视觉的区别
下一篇: C++ windows HTTP 服务器demo
越甲八千
博客等级 码龄11年 2956粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值