与两个Qt程序实例通信

Communicate with two instances of Qt program

本文关键字:Qt 程序 实例 通信 两个      更新时间:2023-10-16

我在我的Qt程序代码中使用,以避免打开第二个实例:

#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
        const char* MEM_KEY = "42";
        QSharedMemory sharedMem(MEM_KEY);
        if (sharedMem.create(1024)) 
        {
            qDebug() << "Create shared memory";
        } 
        else 
        {
            if (sharedMem.error() == QSharedMemory::AlreadyExists) 
            {
                qWarning() << "Already create. Exiting process";
                return 1;
            }
        }
        MainWindow w;
        w.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
        w.show();
        return a.exec();

它工作(这个代码块打开我的应用程序的第二个实例[它是自动关闭的]),但我想发送一个消息或信号从打开的时刻第二个实例到第一个实例来执行例如最大化第一个实例的窗口。你能告诉我如何简单地做这件事吗?

您可以为此目的使用QtSingleApplication。例如:

int main(int argc, char *argv[])
{
    QtSingleApplication a(argc, argv);
    if (a.isRunning())
    {
        a.sendMessage("42");
        qWarning() << "Already create. Exiting process";
        return 1;
    }
    MainWindow w;
    a.setActivationWindow(&w);
    QObject::connect(&a, SIGNAL(messageReceived(QString))
                     , &w, SLOT(onMessageReceived(QString)));
    w.show();
    int ret = a.exec();
    QObject::disconnect(&a, 0, &w, 0);
    return ret;
}

void MainWindow::onMessageReceived(const QString &message)
{
    // Do stuff
}

您正在寻找IPC (进程间通信),遗憾的是,我认为除了创建套接字并在127.0.0.1上侦听之外,没有一种可移植的方法可以做到这一点。但如果你在unix上,我建议使用qdbus。这就是所有很酷的linux程序所做的;)

我相信在windows上也有类似的东西。你可以找到处理你的窗口(HWND)和使用sendmessage()。要发送自定义消息,必须通过以下方式声明自己的WM_SECONDINSTANCE(或类似的东西):

#define WM_SECONDINSTANCE WM_USER
#define WM_SOMEOTHERMESSAGE WM_USER+1

或使用enum(我很懒)。这将告诉您现有的实例已打开另一个实例。要在qt中处理它,请看看这个。

找到HWND,我只是把它从你的第一个实例到你的共享内存。