QT 两个exe之间通信

一、通信方式
通过windowAPI,SendMessage进行通信,等待结果返回,是一种同步的方式。PostMessage是将消息放入消息队列中,立即返回,是一种异步的方式。我采用的是同步的方式,两种方式用法一样。
二、发送方A程序

#pragma comment  (lib,"User32.lib")
#pragma comment  (lib,"Gdi32.lib")
#include <qt_windows.h>
#include <QTextCodec>
#include <future>
#include <Windows.h>
void MainWindow::on_pushButton_clicked()
{
    //查找窗口句柄(L 将该字符串当做Unicode来编译)
    HWND hWnd = FindWindow(NULL, L"王者荣耀");
    if (hWnd != 0) {
        qDebug()<<"\n窗口句柄:" << hWnd;
    }

    //WId wid = this->winId();
    //qDebug()<<"本机hwnd"<<(HWND)wid;
    m_wnd = hWnd;

    if (NULL != m_wnd) { 
        QString command = QString("%1").arg(ui->lineEdit->text());
        std::string param = command.toStdString();
        COPYDATASTRUCT data;           //使用COPYDATA的方式进行数据传递
        data.dwData = 0;               //指定传输的数据
        data.cbData = param.length();  //指定数据大小
        data.lpData = &param[0];       //指向要传递到接收应用程序的数据的指针。可以为空
        
        SendMessage(m_wnd, WM_COPYDATA, 0, (LPARAM)&data);
    }
}

三、接收方B程序
B程序,重写nativeEvent函数

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    if (eventType == "windows_generic_MSG") //windows平台
    {
        MSG* msg = reinterpret_cast<MSG*>(message);
        if (msg->message == WM_COPYDATA)
        {
            COPYDATASTRUCT *data = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
            QTextCodec *gbk = QTextCodec::codecForName("utf-8");
            QString recevice = gbk->toUnicode((char *)(data->lpData));//转码

            ui->label->setText(QString("系统收到消息:%1").arg(recevice));
            return true;//消息不再进行传递,不再处理
        }
    }

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

四、效果图
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值