简述

通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信。

  • 简述
  • 效果
  • 发送消息
    • 自定义类型与接收窗体
    • 发送数据
  • 接收消息
    • 设置标题
    • 重写nativeEvent
  • 更多参考

效果

发送消息

自定义类型与接收窗体

包含所需库,定义发送的自定义类型、接收消息的窗体标题。自定义类型可以处理消息过多情况下,对消息的区分,如果不需要也可以去掉。

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#endifconst ULONG_PTR CUSTOM_TYPE = 10000;
const QString c_strTitle = "ReceiveMessage";

发送数据

点击按钮,进行消息发送。里面的do{…}while用来忽略本窗口,当然自身也可以接受自身的消息。

void onSendMessage()
{HWND hwnd = NULL;//do//{LPWSTR path = (LPWSTR)c_strTitle.utf16();  //path = L"SendMessage"hwnd = ::FindWindowW(NULL, path);//} while (hwnd == (HWND)effectiveWinId()); // 忽略自己if (::IsWindow(hwnd)){QString filename = QStringLiteral("进程通信-Windows消息");QByteArray data = filename.toUtf8();COPYDATASTRUCT copydata;copydata.dwData = CUSTOM_TYPE;  // 用户定义数据copydata.lpData = data.data();  //数据大小copydata.cbData = data.size();  // 指向数据的指针HWND sender = (HWND)effectiveWinId();::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>(sender), reinterpret_cast<LPARAM>(&copydata));}
}

接收消息

设置标题

这一步很重要,必须与上一步的c_strTitle保持一致,否则会找不到窗体。自定义类型CUSTOM_TYPE也必须保持一致,进行过滤。

setWindowTitle("ReceiveMessage");

重写nativeEvent

bool nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG *param = static_cast<MSG *>(message);switch (param->message){case WM_COPYDATA:{COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(param->lParam);if (cds->dwData == CUSTOM_TYPE){QString strMessage = QString::fromUtf8(reinterpret_cast<char*>(cds->lpData), cds->cbData);QMessageBox::information(this, QStringLiteral("提示"), strMessage);*result = 1;return true;}}}return QWidget::nativeEvent(eventType, message, result);
}

更多参考

  • Qt之进程间通信(IPC)
  • Qt之进程间通信(共享内存)
  • Qt之进程间通信(QProcess)
  • Qt之进程间通信(TCP/IP)

Qt之进程间通信(Windows消息)相关推荐

  1. 【Qt】Qt之进程间通信(Windows消息)【转】

    简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...

  2. Qt之进程间通信(IPC)

    简述 进程间通信,就是在不同进程之间传播或交换信息.那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是& ...

  3. Qt 之进程间通信(IPC)

    Qt 之进程间通信(IPC) 简述 通信目的 通信方式 Qt进程通信 TCP/IP Shared Memory D-Bus QProcess Session Management 更多参考 QT5软件 ...

  4. Qt全局热键(windows篇)

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  5. 【Qt】进程间通信之QSharedMemory示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 编程步骤 04. 写端程序示例 05. 读端程序示例 06. 附录 01. 概述 QSharedMemory提供了多个线程 ...

  6. Qt之进程间通信(共享内存)

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  7. linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  8. wince6 qt mysql_用Qt Creator开发Windows的简单计算机的程序

    用Qt Creator开发Windows的简单计算机的程序 因为这次的目的也是为了确认透过Qt来开发WinCE的程序 所以请确认自己的环境是否有设定完成,这部分的进程请看http://www.dotb ...

  9. linux消息通信无法接收,进程间通信:消息队列有关问题:进程1接收不到进程2的消息...

    进程间通信:消息队列有关问题:进程1接收不到进程2的消息 进程间通信:消息队列有关问题:进程1接收不到进程2的消息 日期:2014-05-16 浏览次数:20365 次 进程间通信:消息队列问题:进程 ...

  10. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

最新文章

  1. 如何理解和评价机器学习中的表达能力、训练难度和泛化性能
  2. 自己整合优化的一个Android框架
  3. 网站推广专员浅析高指数关键词优化网站推广如何推至首页?
  4. Android全局修改字体大小,Android 仿微信全局字体大小调整
  5. SpringBoot集成Redis实现排行榜
  6. Direct2D (19) : 图层之 TD2D1LayerParameters.geometricMask (使用几何图形剪裁图层)
  7. CSS 如何设置垂直居中
  8. js 中英文字符串长度
  9. 将Spock 1.3测试迁移到Spock 2.0
  10. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc
  11. iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
  12. 小程序升级服务器内存需要注意什么,小程序服务器内存需要多大
  13. linux log变色
  14. 软件poc测试方案,华为fusioncloud桌面云解决方案5.3poc测试方案v1.0
  15. java和vue实现拖拽可视化_可视化拖拽页面编辑器 一__Vue.js
  16. OSPF配置及MD5验证
  17. 中医针灸学综合练习题库【4】
  18. SAP FICO OAYZ配置定义资产分类中的折旧范围时,无法填写默认折旧年度和期间
  19. 支付宝社交风波以道歉收场,微信小程序会有不同结局吗?
  20. Docker 容器监控原理及 cAdvisor 的安装与使用

热门文章

  1. Javascript (history,location)对象
  2. CLRS2e读书笔记—Chapter10
  3. Dev Grid 添加行号
  4. ubuntu1604 克隆虚拟机后续:修改用户名、主机名和组名
  5. Babel 入门教程
  6. 分区丢失导致文件丢失?巧用EasyreCovery找回
  7. java并发面试题整理
  8. 【总结整理】如何成为小白用户----摘自《人人都是产品经理》
  9. Java Mongodbjar包下载网址
  10. java XML 通过BeanUtils的population为对象赋值 根据用户选择进行dom4j解析