WM_COPYDATA消息可以实现window应用程序之间的数据传输,是同步传输方式。

需要用到结构体 COPYDATASTRUCT

typedef struct tagCOPYDATASTRUCT {
DWORD dwData; //32位自定义的数据
DWORD cbData; // lpData指针指向的数据的大小,单位字节
PVOID lpData; //指向数据的指针,要传输的数据
} COPYDATASTRUCT;

  一般使用 SendMessage()函数发送消息,不使用PostMessage(),可以确保在接收方复制数据前比秒发送方修改或删除数据。

LRESULT SendMessage(
HWND hWND, //接收进程的窗体句柄
UINT Msg, //发送的消息 WM_COPYDATA
WPARAM wParam, //发送进程的窗体句柄
LPARAM lParam, //指向COPYDATASTRUCT数据结构的指针
};

 要注意的是  1、 lParam不能为空;2、lParam不包含接收进程无法访问的对象的指针或引用,比如发送进程自身的HDC、HBITMAP之类的东西。

如果知道接收进程的名字,可以使用FindWindow()函数获取接收进程窗体句柄。

示例:创建两个MFC对话框程序,sendAPP发送时间,receiveAPP接收时间,主要代码如下:

//sendAPP添加一个按钮,添加按钮click处理事件:

//sendAPPDlg.cpp
void CsendAPPDlg::OnBnClickedButtonsendmessage()
{
// TODO: 在此添加控件通知处理程序代码
LPCWSTR szReceiveDlgTitle = L"receiveAPP";
HWND hSendWindow = this->GetSafeHwnd();
HWND hReceiveWindow = ::FindWindow(NULL, szReceiveDlgTitle); COPYDATASTRUCT copyData;
char szSendBuf[MAX_PATH];
time_t timeNow;
time(&timeNow);
sprintf_s(szSendBuf, "%s", ctime(&timeNow));
copyData.dwData = 0;//32位自定义数据
copyData.cbData = strlen(szSendBuf);//lpData指针指向数据的大小,单位字节
szSendBuf[copyData.cbData ] = '\0';
copyData.lpData = szSendBuf;//指向数据的指针,就是你要传输的数据 //第一个参数 hWnd:接收进程的窗体句柄
//第二个参数 Msg:消息类型
//第三个参数 wParam:发送进程的窗体句柄
//第四个参数 lParam:指向COPYDATASTRUCT数据结构体的指针
::SendMessage(hReceiveWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)&copyData); printf("%s\n", szSendBuf);
}

//receiveAPP添加 WM_COPYDATA消息处理函数

//receiveAPPDlg.cpp
BOOL CreceiveAPPDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
char szBuffer[300];
memset(szBuffer, 0, sizeof(szBuffer));
sprintf(szBuffer, "dwData:%d\ncbData:%d\nlpDdata:0x%08x = %s\n",
pCopyDataStruct->dwData, pCopyDataStruct->cbData,
(PVOID)pCopyDataStruct->lpData, (char*)pCopyDataStruct->lpData); SetDlgItemText(IDC_STATIC_Show, szBuffer);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

运行两个exe,点击发送数据,receiveAPP会显示当前时间

总结:

实现两个进程间同步通信,传输较少数据量

1.sendMessage()发送消息;  发送方

2.onCopyData()消息处理函数处理消息。  接收方

发送方和接收方可以是同一个,可以使用FindWindow()函数获取已知窗口名字的窗体句柄。

参考:https://www.cnblogs.com/xiekeli/p/3994380.html

【windows】 进程间通信 WM_COPYDATA消息的更多相关文章

  1. 利用WM_COPYDATA消息实现进程间通信

    进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现. 发送WM_COPYDATA消息: SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM) ...

  2. windows进程通信 -- WM_COPYDATA消息

    WM_COPYDATA消息,在win32中用来进行进程间的数据传输. typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbD ...

  3. [转]Windows进程间通信的各种方法

    http://www.cnblogs.com/songQQ/archive/2009/06/03/1495764.html 道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包) ...

  4. windows进程间通信 .

    摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microso ...

  5. Windows进程间通信的各种方法

    原文:Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线程是Windows操作系 ...

  6. Windows进程间通信(下)

    六.动态数据交换(Dynamic Data Exchange) 动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式.应用程序可以使用DDE进行一次性数据传输,也可以当出 ...

  7. 用WM_COPYDATA消息来实现两个进程之间传递数据

    文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法:在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有   1.使用内存映射 ...

  8. WINDOWS特有的消息常量标识符

    '========================================'WINDOWS特有的消息常量标识符'======================================== ...

  9. VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)

    转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用:  ...

  10. VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的

    消息作用:    在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT {    ULONG_PTR dw ...

随机推荐

  1. 3DText无法被物体遮挡 - 解决

    目录 开篇: 问题复现: 如何解决: 1.创建一个Shader 2.创建一个Material 3.给Material赋值字体 4.给3DText属性赋值 5.查看效果 希望大家:点赞,留言,关注咯~ ...

  2. 阅读B2B使用手册随感

    EDI 协议中最重要的协议之一AS2协议,几乎成为对安全性要求比较高的企业.监管机构的首选.在零售.物流.医药等行业,EDI都有广泛应用.据我所知,在医药行业,几乎全球重要的监管机构都在使用EDI, ...

  3. MATLAB实现随机森林(RF)回归与自变量影响程度分析

      本文介绍基于MATLAB,利用随机森林(RF)算法实现回归预测,以及自变量重要性排序的操作. 目录 1 分解代码 1.1 最优叶子节点数与树数确定 1.2 循环准备 1.3 数据划分 1.4 随机 ...

  4. Djanngo-bbs项目

    1.项目开发基本流程 1.需求分析 2.架构设计 3.分组开发 4.提交测试 5.交付上线 2.项目流程 仿造博客园项目(核心:文章的增删改查) 1.表分析: 1.1用户表 1.2个人站点表 1.3文 ...

  5. ASP.NET Core 系列总结

    <ASP.NET Core> 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习.总结笔记,逐渐 ...

  6. JAVA虚拟机14 类加载器

    1.简介 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的 ...

  7. react 项目的性能优化

    react 项目的性能优化有哪些? 1.react 模块化处理 就是将react内容进行模块化划分,一个模块一个组件,react更新机制是组件重新更新 2.在react项目中更新数据,不要直接将 us ...

  8. vue3 vite 使用NProgress.js纳米级进度条

    NProgress.js 官网:https://ricostacruz.com/nprogress/ 安装方式: npm install nprogress 使用方法 在router 的index.j ...

  9. 易语言 CS1.6单机开源

    一个绘制 一个修改器 垃圾玩意 https://kxd.lanzoul.com/iJiwf07ve61a https://kxd.lanzoul.com/iTT4n07w61tg

  10. vue-cli框架的下载以及框架目录介绍

    目录 vue-cli框架的下载以及框架目录介绍 一.vue-cli创建项目 二.Vue项目目录介绍 vue-cli框架的下载以及框架目录介绍 一.vue-cli创建项目 在终端下载先下载cnpm # ...