Qt如何将外部窗口嵌入部件中

QT---将第三方软件窗口嵌入窗口中 Qt将第三方进程嵌入窗口中。 阅读详情
AI摘要

博客讲解了使用QWindow类通过窗口句柄将外部应用程序嵌入到部件中显示的方法。先介绍通过WinApi根据进程id获取窗口句柄,再用QWindow嵌入到界面。还给出了使用WinApi获取窗口句柄的接口及示例代码,以及将窗口句柄转为QWindow对象并嵌入到QWidget应用程序的方法。

一、简述

今天给大家讲解的是使用QWindow类通过窗口句柄将外部的应用程序嵌入到我们的部件中来显示。在讲解之前可以延伸一下,当时项目中使用QProcess启动一些本地软件或者执行脚本时,需要将启动的第三方窗口嵌入到我们自己写的窗口中,此时我们通过QProcess类的start方法执行相应的启动命令,并获取到启动程序的进程id(pid),然后通过pid获取到窗口对应的句柄,最后通过QWindow类创建容器将外部应用程序嵌入到我们的界面中来。

所以讲解之前,会先讲解下如何通过WinApi根据进程id(pid)获取到窗口的句柄,然后再通过窗口句柄使用QWindow来嵌入到我们的界面中来。

二、代码之路

我们先使用WinApi通过进程id(pid)获取到窗口句柄,具体接口以及示例代码如下,大家可直接拷贝即可:


struct FindWindowData
{
    DWORD processId;
    HWND hWnd;
};

BOOL FindWindowCB(HWND hWnd, LPARAM lParam)
{
    DWORD processId = 0;
    if (GetWindowThreadProcessId(hWnd, &processId)) {
        // 分配足够大的缓冲区来存储窗口标题
        const int MAX_TITLE_LENGTH = 255;
        WCHAR windowTitle[MAX_TITLE_LENGTH];

        // 调用 GetWindowTextW 来获取窗口标题
        int result = GetWindowTextW(hWnd, windowTitle, MAX_TITLE_LENGTH);
        // qDebug() << "the text:" << QString::fromWCharArray(windowTitle) << result << hWnd << processId;

        QString title = QString::fromWCharArray(windowTitle);

        FindWindowData* dataPtr = (FindWindowData*)lParam;
        // 这里的筛选条件可能需要继续优化
        if (processId == dataPtr->processId && IsWindowVisible(hWnd) && title.length() > 0) {
            qDebug() << QString("FindWindow  title:%1, hWnd:%2, pid:%3")
                .arg(title).arg((WId)hWnd).arg(processId);
            dataPtr->hWnd = hWnd;
        }

        return TRUE;
    }

    return FALSE;
}

// 寻找特定PID的窗口句柄
HWND findWindowByPID(DWORD dwProcessId)
{
    FindWindowData winData = { dwProcessId, 0 };
    LPARAM p = (LPARAM)&winData;
    EnumWindows((WNDENUMPROC)FindWindowCB, (LPARAM)p); // 遍历系统上打开的窗口

    return winData.hWnd;
}

HWND getWinIdByPid(int pid)
{
    return findWindowByPID(pid);
}

// 测试示例
void testFunc()
{
	 // 创建进程
    QProcess* process = new QProcess(this);
    connect(process, QOverload<int>::of(&QProcess::finished), this, [=]() {
        process->close();
        process->deleteLater();
    });

    QString command = "xxx.exe";
    process->start(command);
	// 这里等待500毫秒是执行完命令等待窗口显示出来,具体时间得看程序启动的快慢;
    QThread::msleep(500);

	// 获取到pid之后通过接口转为窗口句柄;
    int pid = process->processId();
	HWND hWnd = getWinIdByPid(pid);
}

参考自 https://blog.youkuaiyun.com/joyopirate/article/details/140928311。


下方代码将获取到的窗口具体通过QWindow::fromWinId方法将窗口句柄转为QWindow对象,通过QWidget::createWindowContainer方法创建一个QWidget,可以将刚刚的窗口对象嵌入到基于QWidget的应用程序中,可以在测试方法中看到具体用法,拿到最终QWidget对象大家就可以嵌入到我们界面的布局中去了。

QWidget* getWindowContainerWgt(int pid)
{
	QWidget* pContainerWgt = nullptr;
    HWND hWnd = getWinIdByPid(pid);
    if (hWnd != nullptr) {
		pContainerWgt = new QWidget;
		// 这里也可以设置具体的大小;
		pContainerWgt->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

        QWindow* pDestWindow = QWindow::fromWinId((WId)hWnd);
        pDestWindow->setFlags(pDestWindow->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
        QWidget* pChildWidget = QWidget::createWindowContainer(pDestWindow, pContainerWgt);
        pChildWidget->setObjectName("WindowContainer");

		QHBoxLayout* hLayout = new QHBoxLayout(pContainerWgt);
		hLayout->addWidget(pChildWidget);
		hLayout->setMargin(0);
    }
    else {
        qDebug() << "Can not find winId by pid";
    }

	return pContainerWgt;
}

void testFunc()
{
 	// 创建进程
    QProcess* process = new QProcess(this);
    connect(process, QOverload<int>::of(&QProcess::finished), this, [=]() {
        process->close();
        process->deleteLater();
    });

    QString command = "xxx.exe";
    process->start(command);
	// 这里等待500毫秒是执行完命令等待窗口显示出来,具体时间得看程序启动的快慢;
    QThread::msleep(500);

	// 获取到pid之后通过接口转为窗口句柄;
    int pid = process->processId();
	QWidget* windowWgt = getWindowContainerWgt(pid)
	// 如果获取到的widget不为空,说明已经成功将窗口嵌入到widget中
	if(windowWgt != nullptr){
		// todo
		// ...
	}
}
将外部程序嵌入到Qt界面中 最近在做一个多方软件集成的一个平台,就涉及到将已成熟的软件集成到QT界面中,下边记录一下整个摸索的过程和方法 下边以Foxmail为例进行说明: 第一步:启动软件 QString cmd = QString("D:/Program Files/Foxmail 7.2/Foxmail.exe"); m_process.start(cmd,QStringList()" 阅读详情

相关推荐

Linux下 Qt界面程序嵌入另一个Qt界面程序_Qt应用嵌入外部进程窗口

Qt界面程序嵌入另一个Qt界面程序[Linux]_ptc321的博客-优快云博客_linux qt 窗口嵌套经过测试该文章的内容可以实现让另一个进程的窗口嵌入到主程序窗口;Linux下Qt应用嵌入外部进程窗口_界墟空空的博客-优快云博客_qt 多进程窗口...............

thanklife的专栏 4503

QT打开外部程序并嵌入Qt界面

打开并嵌入外部程序

weixin_43956958的博客 1万+

Qt嵌入外部进程

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

贝勒里恩的博客 3252

QT 如何把外部程序嵌入到QT界面

一个奇怪但又合乎现实需要的需求,就是把外部程序嵌入到本窗口内,实现外部程序在本窗口的显示。可能外部程序是由其他人开发的,但是想“拿来”作为内部使用,于是乎想把外部程序嵌入到本程序窗口内,让他们更像是一个整体。更有甚者,也可以实现外部程序与本程序之间的通讯。

HelloKandy's Blog 9258

【Qt开发教程】嵌入式窗口部件管理QGraphicsProxyWidget类详解及实战应用

QGraphicsProxyWidget 提供了一种将标准窗口部件嵌入到图形场景中的简便方法,使得窗口部件可以像普通图元一样进行操作。通过合理使用该类,可以在 QGraphicsScene 中创建复杂而丰富的图形用户界面,实现灵活的交互效果,并结合其它图元项和视图,使得 Qt 应用程序具备更强大的图形显示和操作能力。

科技改变人类,技术成就未来 1224

QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中

QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中,代码完整,可执行运行

Qt打开外部exe,并将其嵌入到qt界面中

我现在需要用QProcess打开外部exe,并打开的外部界面嵌入到Qt的UI界面中,请问大神们怎样能实现此功能?谢谢啦....Qt打开外部exe已经实现,不过是一个独立的窗口,现在我需要将它嵌入到qt界面中大学的时候玩过VB,也刚好玩过这样的例子,但已经不记得了。下面是我找的一个帖子:https://bbs.youkuaiyun.com/topics/370127341主要涉及到 Windows API:Ge...

zerokkqq的专栏 1万+

LC-3 机器语言 指令集

生活本就沉闷,但跑起来就有风

笔记 1万+

linux下激活窗口 qt,在Linux上通过插件将Qt窗口嵌入到Firefox中

So this is a trivial example of what I'm trying to accomplish:Using QX11EmbedContainer, and QX11EmbedWidget, I can create two separate apps that embed the widget from one into the window of the other ...

weixin_32139169的博客 421

遥感图像小白--2--图像分割

遥感图像分割基础入门

Mary的博客 4233

C#利用S7netplus实现西门子S7_200_SMART PLC高效点位监控与操作

本文详细介绍了如何使用C#结合S7netplus开源库高效监控与操作西门子S7-200 SMART PLC的点位。内容涵盖从开发环境搭建、建立通信连接,到核心的点位读写、批量数据处理及字节与位数组转换等关键技术,并提供了构建稳定监控程序的架构与避坑指南,帮助开发者快速实现上位机与PLC的稳定数据交互。

rum55的博客 315

linux下激活窗口 qt_在Linux上通过插件将Qt窗口嵌入到Firefox中

So this is a trivial example of what I'm trying to accomplish:Using QX11EmbedContainer, and QX11EmbedWidget, I can create two separate apps that embed the widget from one into the window of the other ...

weixin_39828960的博客 436

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

Linux下Qt应用嵌入外部进程窗口

Qt启动嵌入外部进程窗口 Linux x11环境下Qt应用实现多进程窗口嵌入 效果展示 如图: 实现说明 启动外部进程,通过进程id获取窗口winid,然后通过QWindow::fromWinId获取QWindow,使用QWidget::createWindowContainer创建包含进程界面QWidget。 embedexternalapp.cpp embedexternalapp::embedexternalapp(QWidget *parent) : QWidget(parent) {

sbkebcmj的博客 1万+

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

Upwork数据战争:用爬虫与AI预测垄断订单

当普通自由职业者还在“等客户发需求”时,顶尖玩家已用数据预测客户明天需要什么; 当竞争对手熬夜抢单时,你的爬虫早已自动提交提案—— 这不是科幻,而是2025年的现实! 本文将手把手教你用合法工具搭建“数据战情室”,让每个决策都有万亿级数据支撑!

qq_61813593的博客 980

Qt窗口部件——QWidget

QT窗口基础应用篇——窗口部件QWidget 1. 窗口部件与子部件 2. 窗口类型 3. 窗口几何布局 4. qDebug调试程序

MechMaster 3178

【实战】小红书笔记爬虫终极指南:模拟滑动加载,抓取图文(2026最新版)

小红书作为国内最大的生活方式分享社区,每天产生海量的图文笔记。对于数据分析、市场调研、竞品分析等需求,爬取小红书公开笔记成为一项常见任务。然而,小红书的反爬机制日益升级——接口加密、动态Token、滑动验证、设备指纹……本文将深入剖析小红书Web端和App端的爬取技术,手把手教你用Python实现模拟滑动加载、自动抓取图文笔记的完整爬虫系统。全文包含大量代码、原理分析和排坑经验,适合有一定爬虫基础的读者进阶学习。目录前言一、小红书反爬机制概览二、环境准备2.1 Python环境2.2 浏览器驱动。

2201_76125261的博客 760

Qt 嵌入外部窗口

1.在 Windows 系统中,每个窗口都有一个唯一的窗口句柄(Window Handle/HWND),用于在底层操作系统中标识和引用该窗口。3.在 Qt 中,为了与底层窗口系统进行交互,可以通过 WId 类型来传递和操作窗口句柄。WId 可以用于获取底层窗口系统的原生窗口句柄,从而实现与其他平台相关的功能。在Qt窗口中嵌入外部应用程序的窗口,可以利用QT中的QWindow类和WId(Window Identifier)来处理;2.而在Qt框架中,WId 正是用于表示窗口句柄的类型;

weixin_41502364的博客 3196

Vue3 - Element Plus 全局修改更换主题色配置详细教程,element-plus自定义主题色全局替换主色调强力解决方案,支持动态修改主题颜色/动态皮肤,将默认蓝色主题色更换为其他颜色!

vue3,nuxt3,element-plus,组件库,主题色,修改主题颜色,更换主题色,如何修改组件默认主题蓝色,项目主题色定制,修改失败,主题色覆盖不了,:root直接修改,hover颜色没改,自定义主题色,vue3全局设置elementPlus主题色最新详细修改教程,怎么修改全局的颜色,scss变量,覆盖原来的主题色改为自己的颜色,统一替换,有没有好办法,颜色不变,失败,无效,动态主题切换,主题颜色怎么在项目里直接改,plus主题色更换,覆盖默认主题色,最强最好用,设置主题色,换肤,皮肤,动态更换

🏆 前端领域优质创作者 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Qt嵌入外部程序界面初探

项目需要将一个外部软件嵌入自己编写的qt界面,类似于将外部程序当作自己软件的一个插件,以起到集成的目的。自己刚开始用电脑自带的计算器做例子,但一直没成功,换了其他软件就能成功嵌入。 流程: 1)首先打开需要的外部程序; 2)通过spy+获取的外部程序类名; 3)将类名当作函数FindWindow的第一个参数(字符串); 代码: HWND m_pwHwnd = NULL; QWidget* m_widget = nullptr; while (!m_pwHwnd) {

weixin_32155265的博客 7077

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

QT-窗口类部件

QWidget定义:Qt 所有可视化界面控件的基类(Widget = 窗口部件/控件)。特点可以作为独立窗口(如果没有父对象)。可以作为子控件嵌套在别的控件里(比如按钮、文本框)。提供了基本的绘制、事件处理(鼠标、键盘)、布局功能。中文理解:小部件 / 控件。例子:按钮 ()、标签 (QLabel)、输入框 (QLineEdit) 都继承自QWidget。

qq_59805046的博客 1083

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

QT之嵌入外部第三方软件到本窗体中

使用QT开发,有时需要调用一些外部程序,但是单独打开一个外部窗口有的场合很不合适,最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序,一个主程序托n个子程序,为了方便管理将各个程序独立,但是运行还要整体去一起,也就需要将各个子程序嵌入到主程序预留的窗口处。

kbq的博客 3769

Qt中 窗口 子部件以及窗口类型

一、窗口与子部件 窗口: Qt中一般把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏。例如:QDialog及QMainWindow的子类。窗口就是没有父部件的部件,所以又称为顶级部件(top-level widget) 子部件:嵌入在别的窗口中的部件,称为子部件(child widget) 例如一些lablel 和 button (以上内容摘自:Qt Creator快速入门 第三版 霍亚飞) https://doc.qt.io/qt-5/qtwidgets-widgets-windowflag

weixin_40314351的博客 2193

QT打开外部程序并嵌入Qt子窗口的缺点

总之,这样做,是不好用的,所以要么就是以分离软件的形式启动,让它独立运行,或者直接嵌入源码一起编译了(在两个软件都是自己开发的情况了,因为需要源码)。

biao2488890051的博客 3419

Qt Creator 窗口部件

1、基础窗口部件 QWidget QWidget 类是所有用户界面对象的基类,被称为基础窗口部件。QWidget 继承自 QObject 类和 QPaintDevice 类,其中QObject类是所有支持Qt 对象模型的基类,QPaintDevice 类是所有可以绘制的对象的基类。 1.1 窗口、子部件和窗口类型 窗口部件(Widget),是 Qt 中建立用户界面的主要元素。像主窗口 、 对话框、...

wbxshi的博客 689
上一篇: Qt获取本机Mac地址、Ip地址
下一篇: VS如何修改生成的exe程序的名称
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值