Qt 實(shí)現(xiàn)進(jìn)程間窗口嵌套(一)
環(huán)境:Qt 5.9.1_msvc2015_64bit,Window 10.
為了實(shí)現(xiàn)在qt程序中打開(kāi)Window上其他應(yīng)用程序,并將其嵌入到qt程序中。
方法:獲取外部程序的窗口句柄,調(diào)用
[static]QWindow *QWindow::fromWinId(WIdid)
函數(shù)創(chuàng)建QWindow,然后調(diào)用
[static]QWidget *QWidget::createWindowContainer(QWindow *window,QWidget *parent = Q_NULLPTR,Qt::WindowFlagsflags = Qt::WindowFlags())
創(chuàng)建一個(gè)QWidget即可。
關(guān)鍵之處在于如何獲取窗口句柄。
我們都知道Windows編程中,可以通過(guò)FindWindow系列的函數(shù)獲取HWND類型的窗口句柄(需要include windows.h頭文件),HWND類型和Qt中的WId類型可以轉(zhuǎn)換,所以通過(guò)FindWindow我們可以找到想要嵌入的窗口,不論是子窗口還是主窗口,即使是整個(gè)桌面也未嘗不可。
下面貼一下效果圖:
原程序:
這是嵌入之后的Qt程序:
可以看到,在這里標(biāo)題欄和邊框都消失了。很有意思的方法,好奇Qt是如何做到這種進(jìn)程間的嵌套,這篇只是簡(jiǎn)單介紹,待我研究透徹再來(lái)給大家分享。
如果不需要嵌套窗口的話,Qt也提供了其他的方法,不需要如此復(fù)雜。像QDesktopServices類,可以打開(kāi)本地應(yīng)用程序(打開(kāi)文件或網(wǎng)頁(yè)時(shí),自動(dòng)選擇默認(rèn)的應(yīng)用程序)。
一開(kāi)始的目的,是想將office窗口顯示到qt程序里面,采用的是activexQt模塊,但activex的開(kāi)發(fā)需要一定時(shí)間的積累,微軟的東西比較難用,加上activex只能打開(kāi)微軟自家的東西(有待驗(yàn)證),而且如果以后不僅僅是顯示office呢?所以干脆直接嵌套進(jìn)程窗口,一勞永逸。