Qt之进程间通信(Windows消息)

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

简述

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

效果

这里写图片描述

发送消息

自定义类型与接收窗体

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

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#endif

const 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);
}

更多参考

目录
相关文章
|
编解码 Ubuntu 编译器
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
|
3天前
|
Windows
解决windows下Qt Creator显示界面过大的问题
解决windows下Qt Creator显示界面过大的问题
|
5月前
|
安全 测试技术 C++
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
最近用到了gRPC,配置了很长时间,分享一下配置过程。先来看一下我准备的文件包(资源我放在最后)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
3月前
|
Windows Python
windows下jupyter中使用qt5演示动图
windows下jupyter中使用qt5演示动图
100 1
|
8月前
|
Web App开发 缓存 Windows
Windows / Visual Studio / Qt 实用快捷键 (持续更新)
Windows 平台,集成开发环境 Visual Studio 和 Qt 的一些使用键盘的便捷操作
126 0
|
8月前
|
Windows
Windows在线安装QT5.15.2
最近在重新整理自己电脑的环境,所以需要重新安装一下QT,看自己没有发过相关的文章,又觉得这个可以水一篇文章,所以决定写一篇简单的安装教程
526 0
|
编译器 Windows
在windows命令行编译Qt程序并纠错
在windows命令行编译Qt程序并纠错
323 0
在windows命令行编译Qt程序并纠错
|
存储 C++ Windows
|
分布式计算 应用服务中间件 数据库
Windows技术篇——进程、线程、消息机制进程间通信
Windows技术篇——进程、线程、消息机制进程间通信
191 0
|
编解码 算法 安全
Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化
Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化
Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化

推荐镜像

更多