多进程界面开发

说明

所说的多进程界面开发,其实就是两个或多个进程,其中一个主进程exe启动后,需要启动其他进程,并且把其他进程的界面嵌入到我们主进程的窗口中来。
我们平时用到多进程软件查看,如下图所示:
在这里插入图片描述

1、启动外部子进程

启动外部进程方式很多,这里例举两个:
(1)QProcess方式

QProcess * myProcess = new QProcess(this);
QStringList arguments;
myProcess->start("C:/Windows/System32/MyApp.exe");
myProcess->waitForFinished(2000);

(2)CreateProcess方式(只适用于windows)

#include<Windows.h>

QString cmd = "C:/Windows/system32/MyApp.exe";
STARTUPINFO si = {
    
     sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = true;

bool bRet = CreateProcess(
	NULL,
	(LPWSTR)cmd.toStdWString().c_str(),
	NULL,
	NULL,
	FALSE,
	CREATE_NEW_CONSOLE,
	NULL,
	NULL, &si, &pi);

2、找到外部进程类名和窗口名并获取其句柄

(1)找到外部进程类名和窗口名
我们可以使用SPY++工具进行查看外部进程的类名称和窗口名称。
具体教程可参考:https://blog.csdn.net/u013394556/article/details/78534833
说明:Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。
(2)获取外部进程句柄

#include<Windows.h>
	
    WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
    						   QStringLiteral("MyApp软件").toStdWString().c_str());

3、将外部界面嵌入到主界面布局

在第二步获取到句柄后,可以依据句柄获取其窗体并嵌入到新的Widget中,如何将这个新的Widget加入到主界面布局。

    WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
    						   QStringLiteral("MyApp软件").toStdWString().c_str());
    if(wid)
    {
    
    
        QWindow * window = QWindow::fromWinId(wid);		//依据句柄获取窗体
        if(window != NULL)
        {
    
    
            QWidget * widget = QWidget::createWindowContainer(window, NULL, Qt::Widget);
            widget->show();
        }
    }

4、总结

最后说明一下,按1、2、3步骤多加入几个窗口,就可以像说明中的图片一样,如chrom浏览器,想打开多少子窗口就打开多少。
以前还真的没有意识到经常使用的软件都是使用多进程框架编程的。

Guess you like

Origin blog.csdn.net/weixin_42887343/article/details/121030693