调用外部程序,并将其窗口嵌入新程序主窗口界面

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++得到已打开程序的类名或窗口名

vs窗口

点击spy++会跳出如下窗口:
spy++窗口

点击第5个查找窗口的图标,跳出如下窗口:

查找窗口

运行要嵌入的外部程序,将上图查找程序工具后的图标拖到运行的程序窗口,即可得到对应窗口句柄等,如下所示:(示例:将图标拖到左边随意运行的程序的窗口)
窗口句柄获取窗口

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值