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

Allegro规则管理器实战:5步搞定Xnet等长组设置(含Relative Propagation Delay配置)

本文详细介绍了在Cadence Allegro规则管理器中,通过5个实战步骤高效设置Xnet等长组的方法。核心内容包括创建Xnet属性、定义引脚对、建立匹配组,并重点讲解了Relative Propagation Delay规则的配置与应用,帮助PCB设计师确保高速信号时序对齐,提升系统稳定性与性能。

weixin_29193259的博客 518

Comsol有限元网格剖分实战:从基础操作到高效仿真技巧

本文系统介绍了COMSOL有限元网格剖分的核心实战技巧。从基础的物理场控制与用户控制网格选择,到三角形、四边形、四面体等网格单元类型的适用场景,再到扫掠网格、边界层网格与复制网格等高效剖分方法,最后讲解了网格质量评估与几何预处理的关键步骤。旨在帮助用户掌握从自动到手动、从基础到高效的网格剖分艺术,实现仿真精度与计算效率的最佳平衡。

j7k8l的博客 375

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

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

weixin_34405354的博客 424

工业音频故障检测:从CNN到Transformer的技术演进

音频信号处理是工业设备预测性维护的核心技术之一,通过分析设备运行时产生的声波特征实现故障预警。传统方法依赖梅尔频率倒谱系数(MFCC)等手工特征,而深度学习技术尤其是Transformer架构,通过自注意力机制突破了CNN在跨频段特征提取上的局限。Audio Spectrogram Transformer(AST)等先进模型在工业场景中展现出91.2%的高召回率,显著优于传统方案。这种非接触式监测技术结合边缘计算优化,已成功应用于石油化工、电力能源等领域,实现提前72小时预测轴承故障,单项目可避免数百万元的

weixin_30467861的博客 327

SendMessage和PostMessage 的区别 PreTranslateMessage

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

thinker 1907

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2031

麦克斯韦电磁场理论

1)从知识先后上说:麦克斯韦方程组为理解光的传播、反射、折射等现象提供了理论基础。不理解基础,怎么能理解上层建筑。2)从如何学懂上说,把基础学习的越牢,越深刻,后续学习上层建筑就会水到渠成一些,不会越学越多疑问。而是越学越少疑问。

weixin_55255438的博客 2825

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

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

qq_38931619的博客 3312

YOLO11有效改进专栏目录

YOLO11改进专栏导航

A1983Z的博客 3678

vc++中进程间的通信

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

chu_qun的专栏 699

32、生物信息学中的符号、缩写及相关概念解析

本文详细解析了生物信息学中常用的符号、缩写及相关概念,涵盖概率理论、函数表示、模型结构、图与集合、维度参数、神经网络、隐藏马尔可夫模型、双向架构、语法系统、系统发育树、微阵列分析以及核方法与支持向量机等多个领域。通过表格和mermaid流程图的形式,系统梳理了各类符号的定义与应用场景,并介绍了常见缩写的全称与意义。文章旨在帮助研究人员准确理解生物信息学中的基础术语,提升对基因表达分析、序列建模、机器学习等技术的理解与应用能力。

rrr55的博客 146

【AI智能体】Dify 搭建数据分析应用实战操作详解

Dify 搭建数据分析应用实战详解

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值