Qt 与外部exe进程间通信-基于操作系统的消息传递

2023-11-13

步骤:

进程A 通过WindowAPI找到需要传递信息的窗口。

然后通过windowAPI发送自定义的消息(其实本质上还是window操作系统定义的消息结构,只不过其中有个字段的值被设置成了自己特有的值:const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007;)这样在发送带有需要传递的信息。

进程B通过Qt已经实现的 nativeEvent()函数来捕获window系统发送过来的消息。

然后通过对消息的筛选(即之前自定义消息中的特定字段的值的判断ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007来确实是否是自己想要的信息),获取到想要信息后,就直接对信息处理,完成想要的功能。

进程A:

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#include "windows.h"
#endif
const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007;



//
		char strId[256];
		q2s(qstrId).copy(strId , qstrId.size(),0);
		strId[qstrId.size()]= '\0';
//调用window.h种的api来寻找标题为“RKWebViewModel”的窗口。
		HWND hwnd = NULL ;
		QString qstrReceiveName =QString::fromLocal8Bit("RKWebViewModel");
		LPWSTR path = (LPWSTR)qstrReceiveName.utf16();
		hwnd = ::FindWindowW(NULL ,path);
//判断找到的句柄是否为窗口,如果是就通过window的消息COPYDATASTRUCT结构体来实现信息与数据的封装
		if (::IsWindow(hwnd))
		{
			COPYDATASTRUCT  copydata ;
			memset(&copydata , 0 ,sizeof(COPYDATASTRUCT));
			copydata.dwData = CUSTOM_TYPE_SEND_WEBVIEWER;  // 用户定义数据
			copydata.lpData = strId ;  // 指向数据的指针
			copydata.cbData = qstrId.size();    //数据大小
//winApi发送信息(通过操作系统的消息传递机制)
            ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>((HWND)(this->winId())), reinterpret_cast<LPARAM>(&copydata));
			//ProMessageHandleC::sendMessageByCameraInfo((HWND)(this->winId()), c_strTitle, pszData, sizeof(stuDeviceInfo));
		}

 

进程B:

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#endif
const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007;

//bool winEvent(MSG * message, long * result)
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_SEND_WEBVIEWER)
		{
			char strId[256];
			memcpy(strId, reinterpret_cast<char*>(cds->lpData),cds->cbData);
			
			qDebug() << strId <<endl;
			if (!QString(strId).isEmpty())
			{
				m_pWebEngineView->setFloodId(QString(strId));
			}
			return true;
		}
	}
	
    }

	return QWidget::nativeEvent(eventType, message, result);
	//return QWidget::winEvent(message, result);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 与外部exe进程间通信-基于操作系统的消息传递 的相关文章

  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 在 Qthread 中运行函数 - 应用程序将挂起

    我在 QT 内部线程方面遇到一些问题 include
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 当从 html 文件读取 Unicode 内容时,为什么 Unicode 字体在 QTextBrowser 中无法正确显示?

    我正在读一本html文件 该文件基本上包含Unicode案文如下 b akko sati kru akkh ti khy abbahati b h b But the QText浏览器不解释Unicode字体 所以QText浏览器显示如下
  • 如何使用 ClangCodeModel 插件在 QtCreator 中设置 C++ 标准?

    抱歉 如果这是一个愚蠢的问题 但我已经尝试了几乎所有的方法 现在正在用头撞墙 问题是 带有 Clang 代码模型插件的 QtCreator 4 8 0 beta for Windows 解析我的项目 为 C 98 而实际上它是 C 17 但
  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • 构建qt程序时未定义的符号:找不到qt_version_tag

    我正在学习Qt5 6 我正在使用 Ubuntu 14 4 当我链接我的程序时 出现以下错误 undefined reference to qt version tag 在 CMakeLists txt 中 link libraries Qt
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有

随机推荐

  • 数据结构学习系列之顺序表的两种插入方式

    方式1 在顺序表末端插入数据元素 代码如下 示例代码 int insert seq list 1 list t seq list int data if NULL seq list printf 入参为NULL n return 1 if
  • 【学习之路】axios之axios.CancelToken

    写法 接受一个回调函数作为参数 new axios CancelToken cancel gt cancel是取消本次请的方法 if xxx cancel else TODO 一般用法 用于发出多个相同请求时 取消重复请求 使用场景 使用数
  • 虚拟机:[Errno 256] No more mirrors to try

    使用linux系统的yum命令去安装一些软件时总是会出现各种问题 下面总结一下 首先确认yum搭建成功 使用mount挂载 每次开虚拟机 都记得要mount挂载 因为这个mount是暂时的 关机后下次就必须重新挂载 不然yum无法正常进行
  • 微信小程序隐藏滚动条的方法,以及禁止上下滑动的方法

    webkit scrollbar display none width 0 height 0 color transparent ms scrollbar display none width 0 height 0 color transp
  • android 手机网络接入点名称及WAP、NET模式的区别

    移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet设置 APN Access Point Name 即 接入点名称 用来标识GPRS的业务种类 目前分为两大类 CMW
  • PACS系统源码 PACS源码 基于VC + MSSQL开发

    基于VC MSSQL开发的一套大型医院医学影像PACS系统源码 有演示 文末获取联系 PACS系统可以覆盖医院现有放射 CT MR 核医学 超声 内镜 病理 心电等绝大部分DICOM和非DICOM检查设备 支持从科室级 全院级 集团医院级乃
  • @RequestMapping注解和Controller方法建立映射的流程

    当你的才华还撑不起你的野心的时候 唯有静下心来学习 有没有想过 为什么在controller类的方法上 添加一个 RequestMapping toIndex 注解的时候 从浏览器的输入localhost 8080 toIndex请求就可以
  • vscode 配置c/c++环境,与python共用。

    每个人的电脑路径因人而异 下面只是我的配置 仅供参 参考 vscode的安装以及插件软件的安装根据另一个博主的帖子 https blog csdn net weixin 44049923 article details 103619882
  • 小黄的刷题之路(十七)——码题集OJ赛-循环移位

    文章目录 一 题目 二 分析思路 2 1 审题理解 2 2 思路 三 代码实现 3 1 C 实现 四 总结 一 题目 二 分析思路 2 1 审题理解 给我们一个正整数序列 如果能够通过若干次循环左移调整成一个升序序列 那就输出 YES 否则
  • Unity2D--给动画添加关键帧并绑定事件

    关键帧 一添加关键帧 在Animation面板中添加关键帧 二给关键帧绑定事件 添加关键帧后可以先点击关键帧 然后在Inspector面板中绑定事件 Function为方法名
  • Filter实现权限过滤

    有这么一个简单的要求 用户只有登录才能进入主页 一旦退出就无法进入主页 看似好像生来就该如此但代码层次却不简单 首先要判断用户登录状态 然后拦截判断 后面还会学习拦截器 web文件夹下新建一个文件夹名为sys 该文件夹新建jsp页面名为su
  • Linux 查看磁盘空间

    1 查看当前目录的总大小 du sh ps du disk usage 2 查看某个目录的总大小 du sh 目录名 du后面可以跟的参数含义 a 列出所有的文件与目录容量 因为默认仅统计目录底下的文件量而已 h 以人们较易读的容量格式 G
  • Deep Learning 大体概念和事情

    0 深度学习为什么可能 因为一个事物的发生 其背后总有一个理型 或者叫做规律性 这个规律性就体现在原因与结果的作用关系里 把大多数原因和结果进行量化之后 结果与原因间存在一个数量关系方程 使得 结果 f 众原因 找出来这个大致的方程 f 便
  • 前端 Websocket + Stomp.js 的使用

    什么是Stomp STOMP即Simple or Streaming Text Orientated Messaging Protocol 简单 流 文本定向消息协议 它提供了一个可互操作的连接格式 允许STOMP客户端与任意STOMP消息
  • 【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零

    文章目录 顺子日期 特殊时间 乘积尾零 总结 顺子日期 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺子的日期 例如 20220123 就
  • 【Vue学习笔记】- 模板语法

    Vue模板语法分为两大类 插值语法 指令语法 插值语法 功能 作用于标签体内 目的是解析内容 写法 xxx xxx 是js表达式或data中的数据 指令语法 功能 作用于标签自身 可解析 标签属性 标签体内容 绑定事件 举例 v bind
  • java调第三方接口

    目录 背景 Spring的RestTemplate 1 引入依赖 2 RestTemplate配置类 3 RestTemplate实现类 背景 java调第三方接口我百度的有三种方法 第一种 通过JDK网络类Java net HttpURL
  • SpringBoot jar包的部署方式

    centos版本 CentOS Linux release 7 6 1810 Core JDK1 8 一 SpringBoot jar包的部署方式 nohup 后台进程形式 Linux脚本 启动形式 systemd 优雅系统服务形式 sys
  • Tomcat的日志切分和定时删除

    在我负责的一个小系统中 Linux环境下 由于默认日志都是写入在 cattalina out中 我查看日志catalina out 竟然已经到了 40G了 我想做一下 文件内容检索来追踪问题都无法进行 于是我决定删除以前的无用日志 以每日作
  • Qt 与外部exe进程间通信-基于操作系统的消息传递

    步骤 进程A 通过WindowAPI找到需要传递信息的窗口 然后通过windowAPI发送自定义的消息 其实本质上还是window操作系统定义的消息结构 只不过其中有个字段的值被设置成了自己特有的值 const ULONG PTR CUST