一、前言
Qt可以嵌入任意外部.exe程序
二、具体步骤
1、启动你想嵌入的exe程序
2、查看exe的窗口标题以及类名
打开Visual Studio,【工具】–>【Spy++】
键盘【Ctrl + F】,会出现如下窗口:
鼠标点住红色方框内图标,将鼠标移动到我们打开exe窗口上:
【标题】和【类名】是我们后面需要用到的
3、工程文件(*.pro)添加如下代码
LIBS += -luser32
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、运行展示