Qt使用WM_COPYDATA消息进行进程通信

如题,Qt使用WM_COPYDATA消息进行进程通信,这次我们使用windows相关api,来实现不同的 Qt窗口进程间的通信,使用的window的 WM_COPYDATA消息来实现。

实现效果

实现效果是 ,多个客户端 窗口向服务端窗口发送消息,服务端接受到消息后 给客户端一个回馈。效果截图:

代码解读

Qt中截获Windows消息,是使用qt提供的 nativeEvent函数,对着函数进行重载即可。我们是使用的WM_COPYDATA消息,传递的数据,是 下面这个数据结构。
typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData; //自定义数据
DWORD cbData; //指定lpData指向的数据的大小
PVOID lpData; //指向数据的指针
} COPYDATASTRUCT;
使用SendMessage发送消息,使用GetWindowThreadProcessId获取进程ID,使用FindWindowW获取目标窗口的句柄,但是这个函数在Qt中使用 并不是百试百灵,要点好几下 才能找到!这个bug还没找到原因!
博主是在window10环境,Qt 5.9.7版本上开发的。需要工程源代码的同学,可以下载这里,或者github最新代码进行下载。希望对同学们有所帮助。
下面是客户端发送按钮的槽函数

//发送按钮 槽函数
void Widget::on_pushButton_clicked()
{QTextDocument * tx = ui->textEdit->document();QString content = tx->toPlainText();QString dest = "WM_COPYDATA服务端";char* tmp = dest.toUtf8().data();qDebug() <<tmp;LPCWSTR title = reinterpret_cast<LPCWSTR>(tmp);HWND server = ::FindWindowW(nullptr,title);if(!IsWindow(server)){qDebug() << "没有找到服务端!!!";return;}else{qDebug() << "找到窗口:"+dest;}//设置COPYDATASTRUCT结构体COPYDATASTRUCT cds;cds.dwData = winId();//自定义数据cds.cbData = content.length() + 1;//lpData指向数据的长度,如果内容有汉字 貌似长度有问题cds.lpData = content.toUtf8().data();HWND sender = (HWND)effectiveWinId();//SendMessage 消息发送者可以不用填写::SendMessage(server, WM_COPYDATA, reinterpret_cast<WPARAM>(sender), reinterpret_cast<LPARAM>(&cds));
}

下面是服务端的nativeEvent函数的代码:

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG* msg = (MSG*)message;switch(msg->message){case WM_COPYDATA:qDebug() << "收到WM_COPYDATA客户端消息";DWORD dwPid = 0;GetWindowThreadProcessId((HWND)msg->wParam,&dwPid);COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);QString text = QString("PID=[%1]的进程发来的消息为:%2").arg((int)dwPid).arg((char*)cds->lpData);ui->listWidget->addItem(text);//给客户端回一个时间QTime time = QTime::currentTime();QString str = time.toString("hh:mm:ss");COPYDATASTRUCT cds2;cds2.dwData = 0;cds2.cbData = str.length() + 1;cds2.lpData = str.toUtf8().data();::SendMessage((HWND)msg->wParam, WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cds2));return true;}//其他交给qt处理return QWidget::nativeEvent(eventType, message, result);
}

下面时候客户端的nativeEvent函数

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG* msg = (MSG*)message;switch(msg->message){case WM_COPYDATA:qDebug() << "收到WM_COPYDATA服务端消息";COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);QString text = QString("服务端在[%1]接受到该消息").arg((char*)cds->lpData);ui->listWidget->addItem(text);return true;}//其他交给qt处理return QWidget::nativeEvent(eventType, message, result);
}

Qt:Qt使用WM_COPYDATA消息进行进程通信相关推荐

  1. 发送WM_COPYDATA消息实现进程间的通信

    mark一下 结构体 struct Info{ TCHAR g_strFileType[MAX_PATH]; bool bStop; }; 这是发送端的进程 HWND hWndRcv=::FindWi ...

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

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

  3. 使用WM_COPYDATA消息在不同进程间或窗口间通信传递数据

    WM_COPYDATA消息类型属于windows系统标准消息类型,主要用于进程间或不同窗口间进行信息传递,使用此消息的同时在接收端需要重写窗口的消息处理函数DefWndProc,以便读取消息内容. 为 ...

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

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

  5. 进程通信之一 使用WM_COPYDATA C++及C#实现

    /************************************************************************************************** ...

  6. QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置

    QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置 参考文章: (1)QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置 (2)https:// ...

  7. 进程间基于消息队列的通信_Linux 进程间的通信方式

    (一)进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就是创建一个进程,在这个 过程中伴随着资源的分配和释放,可以认为进程是一个程序的一次执行过程. (二)进程间通信的概念 ...

  8. Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

    基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat 1.3.使用虚拟地址访问 ...

  9. qt百度地图html,Qt的QWebChannel和JS、HTML通信/交互驱动百度地图

    Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...

最新文章

  1. java接收xml数据_关于java后台如何接收xml格式的数据
  2. 信号完整性分析心得体会_「职场技能」这8个常用信号完整性的测试手段,你知道几个?...
  3. DPDK 18 log日志系统使用
  4. java ssh 和mvc_[转]JAVA三大框架SSH和MVC
  5. LeetCode 218. 天际线问题(multiset优先队列)*
  6. 云计算教程学习入门视频课件:常用数据库排名
  7. 软件测试---弹出窗口
  8. Java(37)_FlowLayout布局一
  9. windows 编程 之 问题解决笔记
  10. C语言编程学习的经验
  11. 每次离开总是 装做轻松的样子 微笑着说回去吧 转身泪湿眼底
  12. 教室录播系统方案_《课堂教学录播专用教室》建设方案及装备标准
  13. matlab语言中的[~,b]=sort(A)用法介绍
  14. usb驱动开发21——驱动生命线
  15. (五) 数据结构 - 归并排序
  16. Cortex M3 数据观察点与跟踪(DWT)
  17. Python编程基础(2)
  18. redis工具redis Desktop Manager使用
  19. minu-ui 的 mt-datetime-picker 组件在部分安卓机型上不显示日期只有取消和确认按钮
  20. seleniummitmproxy实现智联招聘数据爬取

热门文章

  1. vue框架可以配合php做企业站,基于Vue和PHP打造前后端分离的通用管理系统(一)...
  2. 简单英文题 26 The Nearest Number(python)
  3. 蓝桥杯大赛 青少年创意编程 第十一届 C++组
  4. 项目管理中网络图的看法和相关参数阅读说明
  5. linux档案权限655,Linux学习笔记之档案权限与目录配置
  6. java swing 注册事件_比较Java Swing中三种注册事件的方法
  7. o oia ospf 路由优先_CCNP理论之OSPF协议(二)
  8. Java笔记-通过4个小程序对Java内存初步探究
  9. WebStorm笔记-配置js的webpack识别alias(别名)
  10. 软件设计师习题笔记-重点习题六