Windows下QT嵌入外部程序窗口
要嵌入外部程序窗口,需要将外部程序的标题栏去掉
setWindowFlags(Qt::FramelessWindowHint);
需要的头文件
#include <windows.h>
#include <QProcess>
#include <QWindow>
QProcess* inster_process = NULL;
QString cmd = "F:/mapset_engine/mapset/MapExe/debug/mapset.exe";
WId wid = 0;
窗口嵌入
if(wid == 0)
{
inster_process = new QProcess(this);
inster_process->setProcessChannelMode(QProcess::MergedChannels);
inster_process->start(cmd);
// 时间影响到进程窗口句柄获取,太短获取不到
Sleep(1500);
//Qt5QWindowIcon为程序窗口类,map为外部程序的窗口名
//可以用利用vs自带工具spy++得到程序的类名或窗口名等
wid = (WId)FindWindow(L"Qt5QWindowIcon", L"map");//获取窗口句柄
qDebug() << "wid = " << wid;
QWindow *m_window = QWindow::fromWinId(wid);
// m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint);
QWidget *m_widget;
m_widget = QWidget::createWindowContainer(m_window, this);
// m_widget->setFixedSize(QSize(670,400));
m_widget->setMinimumSize(QSize(670,400));
// ui->verticalLayout_2->addWidget(m_widget);
ui->scrollArea->setWidget(m_widget);
}
else
{
qDebug()<<"wid = "<<wid;
qDebug()<<"地图已嵌入!";
}
关闭调用的外部程序(不完善,有待优化)
//法一、杀死进程
std::string exit_cmd = "taskkill /f /PID " + std::to_string(inster_process->processId());
qDebug()<<"exid_cmd = "<< QString::fromStdString(exit_cmd);
system(exit_cmd.c_str());
// 法二、终止子窗口进程
// if(inster_process->processId() != 0)
// {
// inster_process->terminate();
// inster_process->waitForFinished();
// wid = 0;
// qDebug()<<"wid = "<<wid;
// }
// else
// {
// qDebug()<<"进程已结束";
// }
利用vs自带工具spy++得到已打开程序的类名或窗口名
点击spy++会跳出如下窗口:
点击第5个查找窗口的图标,跳出如下窗口:
运行要嵌入的外部程序,将上图查找程序工具后的图标拖到运行的程序窗口,即可得到对应窗口句柄等,如下所示:(示例:将图标拖到左边随意运行的程序的窗口)