LabVIEW:2015
你可能碰到過(guò)這種需求:需要在自己開(kāi)發(fā)的應(yīng)用程序中嵌入某個(gè)第三方的可執(zhí)行程序,那么該如何實(shí)現(xiàn)呢?其實(shí)是很簡(jiǎn)單的,借助Windows API,簡(jiǎn)單幾步即可完成:
1. 找到待嵌入的窗體句柄,使用WinAPI:
HWND FindWindowA(
[in, optional] LPCSTR lpClassName,
[in, optional] LPCSTR lpWindowName
);
參數(shù)的詳細(xì)描述如下圖所示:
從描述中可以看到,通過(guò)窗口的標(biāo)題來(lái)查找句柄是簡(jiǎn)單可行的方式(當(dāng)有多個(gè)標(biāo)題相同的窗體時(shí),需要用窗體類(lèi)名來(lái)區(qū)分),但是此時(shí) lpClassName需要傳入NULL值,但LabVIEW中并沒(méi)有辦法直接創(chuàng)建NULL值,參考官方給出的解決方案1是可行的(按照值傳遞的方式傳入0,大多數(shù)時(shí)候DLL會(huì)視作指針類(lèi)型參數(shù)傳入的是NULL值),如下圖所示:
于是封裝 FindWindowA() 函數(shù)如下圖所示:
另外如果你想獲取任一窗體的類(lèi)名和標(biāo)題名,借用Spy++工具是很容易的,可以自行搜索下載,當(dāng)然如果你按照了Visual Studio也是帶的有的,如下圖所示:
比如將查找程序工具拖拽到TEST.exe的窗體標(biāo)題欄上,如下圖所示:
2.設(shè)置帶嵌入窗體的父窗體,使用WinAPI:
HWND SetParent(
[in] HWND hWndChild,
[in, optional] HWND hWndNewParent
);
參數(shù)的詳細(xì)描述如下圖所示:
這兩個(gè)參數(shù)比較簡(jiǎn)單,無(wú)需多解釋?zhuān)庋b SetParent() 函數(shù)如下圖所示:
那么如何獲取LabVIEW編寫(xiě)的VI窗體句柄呢?這里提供兩種方式:
通過(guò)上面封裝的 FindWinowA() 函數(shù),傳入窗體標(biāo)題來(lái)獲取;
通過(guò)VI的Front Panel Window.Native Window屬性直接獲取,但是該屬性默認(rèn)是隱藏的,需要在LabVIEW.ini配置文件中加上:SuperSecretPrivateSpecialStuff=True,重啟LabVIEW即可;
有了上述兩個(gè)API其實(shí)就已經(jīng)可以把第三方exe嵌入到VI中了,但是窗體沒(méi)有重繪,效果可能是窗體已經(jīng)嵌入但是是空白的(如下圖所示),需要自己拖動(dòng)一下窗口或調(diào)整其大小才能恢復(fù),另外嵌入時(shí)沒(méi)有辦法去控制嵌入的位置和窗體大小,顯然這并不夠完美,那么還需借助幾個(gè)API來(lái)達(dá)到理想的效果。
3. 獲取窗體的邊界尺寸,使用WinAPI:
BOOL GetWindowRect(
[in] HWND hWnd,
[out] LPRECT lpRect
);
參數(shù)詳細(xì)描述如下圖所示:
參數(shù)也比較簡(jiǎn)單,只是第二個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體指針,這里需要用一個(gè)空類(lèi)型指針來(lái)接收,傳入適配類(lèi)型簇(包含四個(gè)Int32數(shù)值元素),封裝如下圖所示:
4. 移到窗體位置并設(shè)置大小,使用WinAPI:
BOOL MoveWindow(
[in] HWND hWnd,
[in] int X,
[in] int Y,
[in] int nWidth,
[in] int nHeight,
[in] BOOL bRepaint
);
參數(shù)詳細(xì)描述如下圖所示:
封裝如下圖所示:
5.? ?
5.更改指定窗口的屬性,使用WinAPI:
LONG SetWindowLongA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG dwNewLong
);
詳細(xì)參數(shù)描述如下圖所示:
關(guān)于窗口樣式有很多種,這里不便展出,詳細(xì)請(qǐng)參考官方描述,鏈接如下:
https://learn.microsoft.com/zh-cn/windows/win32/winmsg/window-styles
封裝如下圖所示:
6. 指定窗體的顯示狀態(tài),使用WinAPI:
BOOL ShowWindow(
[in] HWND hWnd,
[in] int nCmdShow
);
詳細(xì)參數(shù)描述如下圖所示:
封裝如下圖所示:
7.發(fā)送指定消息到窗口,使用WinAPI:
LRESULT SendMessageA(
[in] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
詳細(xì)參數(shù)如下圖所示:
官方文檔中提到更改窗口的父級(jí)時(shí),應(yīng)同步這兩個(gè)窗口的 UISTATE。有關(guān)詳細(xì)信息,請(qǐng)參閱WM_CHANGEUISTATE和WM_UPDATEUISTATE。封裝如下:
嵌入一個(gè)LabVIEW開(kāi)發(fā)的可執(zhí)行程序如下圖所示:
嵌入Excel應(yīng)用程序如下圖所示:
-
LabVIEW
+關(guān)注
關(guān)注
1986文章
3667瀏覽量
330658 -
API
+關(guān)注
關(guān)注
2文章
1545瀏覽量
63190 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3310瀏覽量
58439
原文標(biāo)題:如何嵌入第三方可執(zhí)行程序
文章出處:【微信號(hào):LabVIEW QT 修煉之路,微信公眾號(hào):LabVIEW QT 修煉之路】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Labview如何內(nèi)嵌操作第三方EXE程序!
如何打開(kāi)第三方軟件
如何把第三方庫(kù)加到PROTEUS中?
如何在LabVIEW中嵌入第三方軟件界面
第三方dll調(diào)用問(wèn)題!!!
LabVIEW與第三方軟件交互問(wèn)題
國(guó)內(nèi)知名第三方檢測(cè)認(rèn)證機(jī)構(gòu)排名
關(guān)于LabVIEW調(diào)用第三方exe,如何去控制第三方exe按鈕的問(wèn)題
頭文件中包含第三方文件
銀行和第三方支付:戀愛(ài)進(jìn)行時(shí)
基于第三方信號(hào)無(wú)源探測(cè)系統(tǒng)研究

C++串口程序第三方類(lèi)代碼免費(fèi)下載

評(píng)論