zoukankan      html  css  js  c++  java
  • 【Qt】Qt之进程间通信(Windows消息)【转】

    简述

    通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用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);
    }


    原文作者:一去丶二三里
    作者博客:去作者博客空间
     
    作者:芝麻科技
    出处:芝麻麻雀-Asp.Net学习之路
    技术:C++,C#
    向我打赏
    加我微信,聊一聊技术
  • 相关阅读:
    excel 2003系列
    DataTab转换XML XML转换DataTable 的类[转]
    全角转半角与半角转全角
    Day2
    Day6 && Day7图论
    Day1
    Android为何以及如何保存Fragment实例
    Android应用的本地化及知识拓展之配置修饰符
    Leetcode NO.136 Single Number 只出现一次的数字
    经典排序算法(四) —— Quick Sort 快速排序
  • 原文地址:https://www.cnblogs.com/mzy-google/p/5162098.html
Copyright © 2011-2022 走看看