一、前言

Qt可以嵌入任意外部.exe程序


二、具体步骤

1、启动你想嵌入的exe程序

Qt嵌入外部进程_qt


Qt嵌入外部进程_#include_02


2、查看exe的窗口标题以及类名

打开Visual Studio,【工具】–>【Spy++】

Qt嵌入外部进程_#include_03


Qt嵌入外部进程_ui_04


键盘【Ctrl + F】,会出现如下窗口:

Qt嵌入外部进程_qt_05


鼠标点住红色方框内图标,将鼠标移动到我们打开exe窗口上:

Qt嵌入外部进程_qt_06


【标题】和【类名】是我们后面需要用到的


3、工程文件(*.pro)添加如下代码

LIBS += -luser32

Qt嵌入外部进程_#include_07


4、完整代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QProcess>
#include <Windows.h>
#include <QWindow>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    QProcess * m_process{nullptr};
    QWindow * m_window{nullptr};
    QWidget * m_widget{nullptr};
    PROCESS_INFORMATION pi;

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->resize(1920,1080);

    QString cmd = "C:/4/OPenGL.exe";
    STARTUPINFO si = { sizeof(si) };
    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);

    Sleep(1000);
    WId wid = (WId)FindWindow(L"Qt5QWindowOwnDCIcon", L"The first OpenGL Window");//获取窗口句柄,类名,标题
    m_window = QWindow::fromWinId(wid);
    if(m_window) {
        m_widget = QWidget::createWindowContainer(m_window, this, Qt::Widget);
        if(m_widget) {
            ui->tabWidget->addTab(m_widget,"OPenGL");
        }else {
            qDebug()<<"m_widget失败";
        }
    }else {
        qDebug()<<"m_window失败";
    }

}

MainWindow::~MainWindow()
{
    DWORD exitCode; //退出码
    TerminateProcess(pi.hProcess, exitCode);    //退出进程

    delete ui;
}

5、运行展示

Qt嵌入外部进程_ui_08