Qt实现不同项目的信号传递

2023-11-14

Qt实现windows通信(不同项目的窗口通信)

有关Qt通信的知识
windows要实现不同项目窗口通信,需要用类似于windows.h的api接口。
数据传输主要通过
typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData; //自定义数据
DWORD cbData; //指定lpData指向的数据的大小
PVOID lpData; //指向数据的指针
} COPYDATASTRUCT;结构体来实现

  1. 实现在本窗口中找到目标窗口句柄include<qt_windows.h>
void Widget::on_pushButton_clicked()
{
    HWND hwnd = NULL;
    const QString c_strTitle = "win";
//    do
    //{
        LPWSTR path = (LPWSTR)c_strTitle.utf16();
        hwnd = ::FindWindowW(NULL,path);
    //}
    if(::IsWindow(hwnd))
    {
        qDebug() << "ok ,find it!";
        qDebug() << path;
    }
}

函数HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
函数BOOL IsWindow(HWND hWnd);
如果窗口句柄标识了一个已存在的窗口,返回值为非零;如果窗口句柄未标识一个已存在窗口,返回值为零。
2. 把要使用到的信息写入结构体

typedef struct COPYDATASTRUCT {
DWORD dwData; //自定义数据
DWORD cbData; //指定lpData指向的数据的大小
PVOID lpData; //指向数据的指针
} COPYDATASTRUCT;结构体来实现

其中dwData是信息的一种类似于标记的东西,在接收的信息中筛选出该信息

QString content = "close"; //设置消息内容
    const ULONG_PTR CUSTOM_TYPE = 10000;
    COPYDATASTRUCT cds;
    cds.dwData = CUSTOM_TYPE;
    cds.cbData = content.toUtf8().size(); //转换成utf8格式,方便后续还原消息
    cds.lpData = content.toUtf8().data();
  1. 最后就是把这个消息给发送出去就好了
//设置发送消息的句柄
    HWND sender = (HWND)effectiveWinId();
    qDebug() << sender;
    //reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数
    //(expressoin)有完全相同的比特位
    ::SendMessage(hwnd,WM_COPYDATA,reinterpret_cast<WPARAM>(sender),reinterpret_cast<LPARAM>(&cds));
  1. 接下来是接收窗口的函数写法,使用到的是nativeEvent事件函数,我们需要重写该函数
//在.h文件中声明
#include<qt_windows.h>
//同时在类中声明
private:
	bool nativeEvent(const QByteArray &eventType, void *message, long *result);
//在.cpp文件中
#include<QDebug>
const ULONG_PTR CUSTOM_TYPE = 10000;
bool win::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);
            //使用massagebox显示消息
            QMessageBox::information(this,QStringLiteral("消息"),strMessage);
            *result = 1;
            return true;
        }
    }
    }

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

其中MSG是windows的消息结构体,经过筛选后可以拿到之前发出的消息,之后还原成utf8形式就好啦。

关于nativeEvent的使用

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

Qt实现不同项目的信号传递 的相关文章

随机推荐

  • webpack : 无法加载文件 C:\Users\12987\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。

    通过查询综合了意见给出以下解决办法 webpack src index js o build built js mode development出现的问题 解决 1 管理员身份cmd输入 set ExecutionPolicy Remote
  • ubuntu 18.04 安装 opencv-2.4.13.6

    ubuntu 18 04 安装 opencv 2 4 13 6 1 opencv 2 4 13 6下载 2 安装opencv 2 4 13 6 1 解压opencv 2 4 13 6 zip到根目录下 2 安装opencv 2 4 13 6
  • 几个友好Java代码习惯建议

    我工作多年 遇到过各种各样的同事 我见过各种代码 优秀的 垃圾的 没有吸引力的等等 所以这篇文章记录了一个优秀的Java开发应该具备哪些良好的开发习惯或最佳实践 1 封装方法参数 当你的方法参数过多时 建议封装一个对象 下面是反面教材 谁教
  • 理解傅里叶分析

    一 什么是频域 从我们出生 我们看到的世界都以时间贯穿 股票的走势 人的身高 汽车的轨迹都会随着时间发生改变 这种以时间作为参照来观察动态世界的方法我们称其为时域分析 而我们也想当然的认为 世间万物都在随着时间不停的改变 并且永远不会静止下
  • 【Mybatis】mybatis3入门

    mybatis简介 MyBatis 是一款优秀的持久层框架 它支持定制化 SQL 存储过程以及高级映射 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的 XML 或注解来配置和映射
  • 【经验分享】- 这是一份来自 IT 男的电脑使用建议

    这是一份来自 IT 男的电脑使用建议 1 写在前面 2018 年高考结束我拿到了第一台笔记本电脑 此前对电脑接触地并不多 因此在这几年的电脑使用过程中积累了一些个人使用经验和使用技巧想要分享给可能还是电脑小白的你 个人一直以来用的还是 Wi
  • 自己动手定制Chromium系列之四:Chromium 58的一个编译配置

    aec untrusted delay for testing Current value from the default false From third party webrtc modules audio processing BU
  • (成功解决)Python连接clickhouse

    第一次尝试用Python连接clickhouse数据库 踩了不少坑 特此记录 帮助后人少犯错 运行环境 python 3 8 3 clickhouse driver 0 2 3 clickhouse sqlalchemy 0 2 0 sql
  • Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

    linux静态库生成与使用 http www cnblogs com johnice archive 2013 01 17 2864319 html Linux中so文件为共享库 与windows下dll类似 不过实现要简单 so可以供多个
  • 小熊错误_小熊派4G开发板初体验

    开发板硬件资源介绍 前阵子小熊派发布了一款超高性价比的4G开发板 但是板子仅限量1000套 小熊派官方给我送了一块 我们一起来学习学习 板子做得小巧精致 控制核心用的是移远的EC100Y LTE Cat1无线通信模组 该模组可对所有用户开放
  • Python开发环境Wing IDE如何使用调试功能

    在使用Wing IDE开始调试的时候 需要设置断点的行 读取GetItemCount函数的返回 这可以通过单击行并选择Break工具栏条目 或通过单击行左边的黑色边缘 断点应该以实心红圈的形式出现 接下来使用绿色箭头图标开始调试或在Debu
  • 基于微信小程序的健身小助手小程序

    文末联系获取源码 开发语言 Java 框架 ssm JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 8 0 数据库工具 Navicat11 开发软件 eclipse myeclipse idea Maven包
  • Mysql中分组后取最新的一条数据

    在 SQL 中 你可以使用子查询和 ORDER BY 子句来实现按照特定字段进行分组 并获取每个分组中最新的一条记录 SELECT t1 FROM your table t1 INNER JOIN SELECT id MAX timesta
  • 云技术平台赋能媒体融合发展创新

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 熊普江 媒体行业是传统而又新兴的行业 在数字化 信息化 移动化快速演进的今天 无论是用户 社会还是行业 政府都意识到 传统媒体与新兴媒体融合发展是必然之路 但媒体融合需要内容
  • 2021-07-14 React 代码规范整理

    文章目录 React 代码规范 1 基础规则 2 组件声明 1 组件名称和定义该组件的文件名称建议要保持一致 2 不要使用 displayName 属性来定义组件的名称 应该在 class 或者 function 关键字后面直接声明组件的名
  • 烟花代码

    div div
  • 日志-Log4J

    日志 程序中的日志可以用来记录程序在运行的时候点点滴滴 并可以进行永久存储 日志和输出语句的区别 输出语句 日志技术 取消日志 需要修改代码 灵活性比较差 不需要修改代码 灵活性比较好 输出位置 只能是控制台 可以将日志信息写入到文件或者数
  • R语言之 as.formula()

    今天学到一个东西 R 语言回归函数里面的公式函数 as formula 其作用就是将字符串转换成公式 gt aa ReadCount Age BMI Sex HAMD 1 1 Sex gt aa 1 ReadCount Age BMI Se
  • MFC之滑块与旋转控件23

    1 滑块 首先看看滑块相关的内容 从sitch看到 滑块分为五个内容 分别是矩形滑块位置 滑块左右两边的箭头 和矩形滑块分别距离左右两边的空间 1 先添加滑块控件和显示矩形滑块的位置编辑区 2 右击编辑区添加变量为int类型 3 添加滑块为
  • Qt实现不同项目的信号传递

    Qt实现windows通信 不同项目的窗口通信 有关Qt通信的知识 windows要实现不同项目窗口通信 需要用类似于windows h的api接口 数据传输主要通过 typedef struct tagCOPYDATASTRUCT cds