QT怎么把别的exe程序嵌入到自己的窗口中

QT怎么把别的exe程序嵌入到自己的窗口中,第1张

etProgram(sProgram)

pProcess->start()

qint64 lID = pProcess->processId()

QWindow* window = QWindow::fromWinId(lID)

QWidget* widget = QWidget::createWindowContainer(window, this, Qt::Widget)

widget->show()

我自己写的一段代码,

Qt 实现进程间窗口嵌套

环境:Qt 5.9.1_msvc2015_64bit,Window 10.

为了实现在qt程序中打开Window上其他应用程序,并将其嵌入到qt程序中。

方法:获取外部程序的窗口句柄,调用

[static]QWindow *QWindow::fromWinId(WIdid)

函数创建QWindow,然后调用

[static]QWidget *QWidget::createWindowContainer(QWindow *window,QWidget *parent = Q_NULLPTR,Qt::WindowFlagsflags = Qt::WindowFlags())

创建一个QWidget即可。

关键之处在于如何获取窗口句柄。

我们都知道Windows编程中,可以通过FindWindow系列的函数获取HWND类型的窗口句柄(需要include windows.h头文件),HWND类型和Qt中的WId类型可以转换,所以通过FindWindow我们可以找到想要嵌入的窗口,不论是子窗口还是主窗口,即使是整个桌面也未尝不可。

下面贴一下效果图:

原程序:

这是嵌入之后的Qt程序:

可以看到,在这里标题栏和边框都消失了。很有意思的方法,好奇Qt是如何做到这种进程间的嵌套,这篇只是简单介绍,待我研究透彻再来给大家分享。

如果不需要嵌套窗口的话,Qt也提供了其他的方法,不需要如此复杂。像QDesktopServices类,可以打开本地应用程序(打开文件或网页时,自动选择默认的应用程序)。

一开始的目的,是想将office窗口显示到qt程序里面,采用的是activexQt模块,但activex的开发需要一定时间的积累,微软的东西比较难用,加上activex只能打开微软自家的东西(有待验证),而且如果以后不仅仅是显示office呢?所以干脆直接嵌套进程窗口,一劳永逸。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7818316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存