Qt 实现进程间窗口嵌套(一)

时间:2024-03-14 15:19:39

环境: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 实现进程间窗口嵌套(一)


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

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

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


参考链接:http://blog.csdn.net/dazhong159/article/details/7903382 -如何获取window窗口句柄