VC++消息控制 SendMessage用法(转)

VC++窗体通信:SendMessage同步机制、跨线程陷阱与实战应用 在Windows桌面应用开发中,消息机制是实现窗体间通信与线程同步的核心基础。其原理基于事件驱动模型,通过消息队列和窗口过程实现不同组件间的指令与数据传递。这一机制的技术价值在于提供了高效、解耦的通信方式,是实现界面响应、后台任务通知等功能的关键。在VC++开发中,SendMessage函数作为同步消息发送的基石,广泛应用于控件交互、跨线程UI更新等场景。然而,其同步阻塞特性在跨线程调用时容易引发界面卡顿甚至死锁,这是开发者必须警惕的常见陷阱。本文深入剖析SendMessage的同步机制、参数传递的内存管理 阅读详情

最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有一个能完全做出来的。要知道VC编程有一个小地方出错,都可能是个让你头晕脑胀的事情。经过我后来不但探索,经过改进之后,一点错误都没有,现在贴出来供大家参考。

      1. 先来个基本知识介绍

SendMessage的基本结构如下:

SendMessage(

    HWND hWnd,  //消息传递的目标窗口或线程的句柄。

    UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)

    WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,

  //在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。

    LPARAM lParam); //参数2

其中一些参数的由来如下:

//typedef unsigned int UINT;

//typedef UINT WPARAM;

//typedef LONG LPARAM;

//typedef LONG LRESULT;

2.  SendMessage用法实例

    例如可以用以下语句:

void CTScrollWinView::OnLButtonDblClk(UINT nFlags, CPoint point)
       {
            // TODO: 在此添加消息处理程序代码和/或调用默认值

     ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK ,0,0);

     CScrollView::OnLButtonDblClk(nFlags, point);
       }

这是我用VC2008下建立的一个多文档选项卡式工程里面的一段代码,是为了实现在子窗口双击后发送一个不带参数的消息(其ID为WM_USER+1)给主窗口, 如上为部分代码, 其中WM_CHILDFRAMEDBCLK是自定义的消息ID, AfxGetMainWnd()->m_hWnd是获得主窗口(这里不能使用GetParent()->m_hWnd或者GetParentFrame()->m_hWnd, 因为这是获得父窗口,但父窗口不一定是主窗口,一定要注意,不然消息就会发错导致接收不到,我这里卡了半天,后来在QQ群里一位大侠告诉我的,在此再感谢一下那位大侠);

3. 在接收消息的窗体以及线程所在的头文件里定义:

#define WM_CHILDFRAMEDBCLK  WM_USER+1   // do something

4. 然后接下来定义一个消息需要映射的函数,如下:

afx_msg LRESULT OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam);

注意格式必须是:两个参数必不可少,返回类型一定为LRESULT,网上很多文章都忽略了这两点,这也是网上文章普遍错误的地方。

5. 添加消息函数映射

    ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)

    注意这里必须是ON_MESSAGE, 不能使用ON_COMMAND, 前者主要针对用户自定义消息,后者针对

WM_COMMAND命令,比如菜单、工具栏等.

6. 实现消息函数:

我们在接收窗体里定义一个这样的事情(过程),

LRESULT CMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam)
      {
            CancelFullScreenWin();  // 这里调用了一个使子窗口全屏的自写函数,我就不贴出来了,以后专题将的时候会提到

      return 0;
      }

 

7. 下面是部分代码,要想搞清楚自定义消息发送只看这部分代码就足够了

在MainFrm.h头文件里定义了消息如下:

      #define WM_CHILDFRAMEDBCLK WM_USER+1

然后在MainFrm.cpp中声明需要映射的消息函数如下:

      afx_msg LRESULT OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam);

再在MainFrm.cpp中添加映射如下:

      BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
                   ON_WM_CREATE()
                   ON_COMMAND(ID_FullScreen, OnViewFullscreen)
                   ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)   // 映射添加到这里
             END_MESSAGE_MAP()

然后在MainFrm.cpp中实现OnChlidFrameDBClick()方法,如下:

LRESULT CMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam)
       {
            CancelFullScreenWin();//自己定义的函数,你们可以在这里完成自己需要的业务

     return true;
       }

最后就可以发送消息给主窗口了,如下:

void CTScrollWinView::OnLButtonDblClk(UINT nFlags, CPoint point)
      {
            // TODO: 在此添加消息处理程序代码和/或调用默认值

     ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_USER+1,0,0);

     CScrollView::OnLButtonDblClk(nFlags, point);
      }

总结一下:①注意定义消息的ID不能重复,要用WM_USER+n;

                  ②注意定义的消息函数的返回值一定是LRESULT, 并且有两个参数分别必须为WPARAM和LPARAM ;

                  ③注意映射用ON_MESSAGE, 而不是ON_COMMAND;

                  ④注意传给主窗口的消息在CXXXXView类中要用AfxGetMainWnd()->m_hWnd获得主窗口。

至此就讲完了,希望对大家找不对资源的有所帮助

VC++进程间通信实战:共享内存、命名管道与窗口消息详解 进程间通信是操作系统协调多个独立进程协同工作的核心技术,其原理在于通过操作系统提供的机制,在不同进程的独立地址空间之间安全、高效地交换数据与指令。这项技术的核心价值在于实现模块解耦、资源复用和系统扩展,广泛应用于高性能计算、客户端/服务器架构、插件系统以及系统监控等场景。在Windows平台的VC++开发中,共享内存凭借其近乎零拷贝的特性,成为大数据量传输的性能王者,尤其适合音视频流、科学计算中间结果等场景;而命名管道则提供了面向连接的可靠流通信,是实现后台服务与多客户端交互的稳健选择。本文聚焦于这两种核心 阅读详情

相关推荐

VC++多线程控制动态图标:Win32 API实现与线程同步详解

多线程编程是提升桌面应用响应性和用户体验的核心技术,其原理在于将耗时任务与用户界面操作分离到不同执行流,避免主线程阻塞导致的界面卡顿。在Windows平台,通过Win32 API的CreateThread函数创建工作线程,结合事件、临界区等同步机制,可以实现高效的后台任务处理。这一技术对于需要实时反馈的应用场景价值显著,例如文件传输、数据计算或网络请求过程中的状态指示。本文聚焦于利用VC++和Win32线程模型,实现一个由工作线程驱动的动态图标控件,详细解析了从线程创建、自定义消息通信到双缓冲绘图消除闪烁的

415

【转】vc中使用SendMessage正确发送自定义消息的方法--不错

原文网址:http://zhoumf1214.blog.163.com/blog/static/5241940200910265532959/ 最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有一个能完全做出来的。要知道VC编程有一个小地方出错,都可能是个让你头晕脑胀的事情。经过我后来不但探索,经过改进...

weixin_30362083的博客 421

VC++实战:Windows窗体文字信息获取原理与API详解

在Windows桌面应用开发中,窗体(Window)是用户界面的基本单元,每个窗体通过唯一的句柄(HWND)标识。理解窗体系统的工作原理是进行GUI编程和自动化操作的基础,其核心在于消息驱动机制。通过向窗体发送特定消息,可以实现对界面元素的精准控制,这一原理在自动化测试、辅助工具开发等领域具有重要技术价值。例如,在自动化测试场景中,需要获取和验证窗体控件的文本内容以确保功能正确性;在屏幕阅读或RPA流程中,准确提取窗体文字是实现自动化的关键步骤。本文聚焦于使用VC++调用Windows原生API,深入解析E

weixin_29597551的博客 276

vc中怎么使用SendMessage自定义消息函数

vc中怎么使用SendMessage自定义消息函数: SendMessage的基本结构如下: SendMessage(     HWND hWnd,  //消息传递的目标窗口或线程的句柄。     UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)     WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类...

weixin_33929309的博客 556

VC++消息映射机制深度解析:从Windows消息泵到MFC实战避坑指南

消息驱动架构是Windows GUI编程的核心基础,其原理基于操作系统生成消息、应用程序通过消息泵循环获取并分派消息到窗口过程。这一机制构成了所有Windows桌面应用的运行基石,其技术价值在于实现用户输入与程序逻辑的解耦,支撑了响应式交互体验。在MFC框架中,消息映射表通过静态数据结构将消息ID与处理函数关联,替代了原始的switch-case处理方式,大幅提升了开发效率。然而,在维护遗留系统或进行混合开发时,开发者常面临消息路由失效、线程安全等工程挑战。本文聚焦VC++消息映射,深入剖析CWnd::Wi

weixin_30512089的博客 372

VC++模拟键盘输入:从keybd_event到SendInput的实战指南

在Windows桌面应用开发中,模拟键盘输入是实现自动化脚本、游戏辅助工具和无障碍辅助软件的核心技术。其原理是通过程序代码生成虚拟按键事件,模拟用户真实的键盘操作,从而驱动目标应用程序响应。从技术价值看,这为软件自动化、测试工具开发和辅助功能实现提供了基础能力。常见的应用场景包括自动化数据录入、游戏宏命令执行、远程控制输入等。在VC++开发环境下,实现这一功能主要依赖Windows API,其中keybd_event函数作为经典但已过时的底层模拟方案,而SendInput函数则是现代且全面的推荐选择,支持原

weixin_31421613的博客 306

vc中使用SendMessage正确发送自定义消息的方法

  最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有一个能完全做出来的。要知道VC编程有一个小地方出错,都可能是个让你头晕脑胀的事情。经过我后来不但探索,经过改进之后,一点错误都没有,现在贴出来供大家参考。      1. 先来个基本知识介绍SendMessage的基本结构如下:Se

a2289650的专栏 596

VC++程序获取其它程序控件句柄并进行操控

一个窗口的Z 序 ,指明了该窗口在重叠窗口堆中的位置

m0_60352504的博客 1924

VC++模拟鼠标单击与双击:从Windows消息机制到SendInput实战

在Windows桌面应用开发与自动化测试中,模拟用户输入是核心需求之一,其底层原理基于Windows消息机制。系统通过消息队列处理如WM_LBUTTONDOWN、WM_LBUTTONUP等鼠标事件,而模拟操作的本质是向目标窗口或系统输入流注入这些消息。关键技术价值在于实现自动化测试、辅助工具及脚本编写,提升效率与准确性。应用场景广泛,包括自动化填表、游戏宏录制及无障碍辅助程序开发。本文聚焦于使用VC++实现稳定可靠的模拟鼠标单击与双击,深入剖析了SendInput、mouse_event等API的调用细节与

weixin_34062469的博客 321

精通VC++窗体通信技术:SendMessage详解

在现代软件开发中,尤其是在图形用户界面(GUI)的设计与实现过程中,窗体间通信是一个不可或缺的部分。VC++作为Microsoft Visual Studio中强大的编程语言和开发环境,支持开发者构建复杂的应用程序。通过窗体通信,应用程序的不同部分可以相互通信和协调工作,实现数据的交换与事件的传递。本文将从VC++的窗体通信入手,重点分析SendMessage函数的使用和窗体间数据传递的机制。

weixin_29097457的博客 678

vc中使用SendMessage自定义消息函数

SendMessage的基本结构如下: SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄。 UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,) WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的, //在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。 LPARAM lParam); //参数2 其中一些参数的由来如下: //typedef unsigned int UINT; //typedef UINT WPARAM; //typedef L

VC++跨进程通信实战:Windows消息机制与外部程序控制

在Windows编程中,进程隔离机制确保了系统的稳定性与安全性,每个程序运行在独立的内存空间内。为实现程序间协作,Windows提供了基于消息机制的跨进程通信框架,其核心原理是通过窗口句柄(HWND)作为标识,利用SendMessage与PostMessage等API进行进程间指令与数据交换。这项技术的工程价值在于能够实现自动化控制、软件集成与辅助工具开发,广泛应用于自动化测试、数据监控、办公辅助等场景。本文聚焦于VC++环境下如何通过Windows消息机制访问其他应用程序类,深入解析了FindWindow

weixin_32496547的博客 223

vc中SendMessage自定义消息函数用法实例

主要介绍了vc中SendMessage自定义消息函数用法,以实例实行详细讲述了SendMessage的定义、原理与用法,具有一定的实用价值,需要的朋友可以参考下

[vc++][消息]C++中消息的种类

3.4 三种类型的消息 在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。 3.4.1 窗口消息 窗口消息(Window Message)一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗 口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。 当用SendMessage()或PostMessage()发送一个窗口消息时,变量Message、wParam和 l...

Jacky_Dai的专栏 803

手把手教你用HarmBench数据集测试大模型安全性(含多模态案例)

本文详细介绍了如何使用HarmBench数据集测试大模型的安全性,包括文本和多模态越狱指令的实战案例。通过环境配置、数据集获取、测试流程及结果分析,帮助开发者全面评估和提升大模型的安全防护能力,特别关注多模态攻击的防御策略。

weixin_26642481的博客 325

WINDOWS下SIP拨号的实现

在WIN10上拨打SIP电话  由于我的交换原理实验有一个是关于SIP的抓包的。而之前从未接触过SIP,所以在如何完成一次SIP拨号上遇到了不少问题,查了好多资料都没有完整的或者写的很清楚的,这里就对那些资料做一个总结,给出一个比较完善的解决方案,一来是记录此次实验的收获,而来也可能为其他有同样困惑的人解惑。  废话不多说直接开始。首先是下载一个可以拨打SIP电话的客户终端,这里我选择的是MicroSIP, 下载红圈内的文件,下载好之后直接一路安装即可,没有什么特别注意的地方。  安装好客户端之后,就需要注

weixin_43918519的博客 3807

VC++ 控制外部程序,向外部程序发送一个消息的方法

这里需要考虑两部分的内容: 发送端: 查找对应的窗体,找到CWnd的值 向窗体发送消息 举例: CWnd* wnd = FindWindow(NULL, _T("选择题做题过程中")); if (wnd == NULL) { AfxMessageBox(_T("找不到程序!")); } else { ::Send...

weixin_34405354的博客 424

用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移

本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。

kkk56的博客 856

SendMessage和PostMessage 的区别 PreTranslateMessage

2012-05-25 13:34 SendMessage和PostMessage 的区别,以及消息循环路由   一、下面示例函数func()中有PostMessage和SendMessage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  int MainWnd(...)  {   MSG msg;   while(1)

thinker 1907

Python 爬虫实战:爬取知乎问答与评论数据并分析

摘要:本文以Python为核心工具,系统讲解知乎问答与评论数据爬取的技术方案。通过分析知乎API接口结构,详细阐述Requests库结合正则表达式的数据获取方法,涵盖请求头构造、鉴权参数处理等关键技术。文章对比了HTML解析、API调用和Selenium模拟三种爬取方案的优劣,提供完整的代码实现,包括问题信息获取、回答列表爬取和评论数据提取。同时介绍了数据存储(JSON/Excel)和基础文本分析(词云生成)方法,并给出合规使用建议和技术优化方向,为开发者提供了一套可落地的知乎数据爬取与分析解决方案。

2503_91057718的博客 1820

Grafana 可视化配置

Grafana 可视化操作使用

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 1940

VC++后台图色,后台文字识别,后台键鼠的实现,VC++找图找色找字识字的源码实现

在VC++中实现后台键鼠,简单的可以用Windows消息模拟,就是调用Windows API函数SendMessage或者PostMessage向目标进程发送键鼠消息,这种方式对大部分窗口还是适用的,按键自带的后台功能就是用这种方式实现的. 强大一点甚至完整的后台键鼠功能还需要注入目标进程Hook与键鼠输入相关的所有函数,也就是让目标进程执行注入的函数,这可以控制目标进程的行为,实现后台键鼠的功能.比如DX模式的键鼠就是要Hook目标进程的GetDeviceData,GetDeviceState这两个函数.

qq_38931619的博客 3312

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1561

vc++中进程间的通信

vc++中进程间的通信2006-11-23 10:44  一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方  另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程

chu_qun的专栏 699

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3320

我的世界模组开发——前言

避坑:在开发过程中一定不要过分依赖AI,虽说现在的人工智能很厉害,但是也有很大的弊端,很多AI生成的代码错误百出,还得自己修改,而且像deepseek这种AI的训练数据还停留在一年前,给出的maven仓库地址都是过时的甚至是错误的,开发模组就是要多学习,多看源码,这样开发模组的水平才能越来越高。总而言之,build.gradle文件在我的世界Forge模组开发中扮演了重要的角色,它定义了项目的构建过程、依赖关系和编译选项,为开发者提供了灵活而强大的构建工具。开发工具推荐使用idea,因为可以使用通灵义码。

qq_24992377的博客 2594
上一篇: VC 调试之内存
下一篇: MySQL 错误1067解决方法
岚尘
博客等级 码龄18年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值