LabVIEW:2015
你可能碰到過這種需求:需要在自己開發(fā)的應(yīng)用程序中嵌入某個第三方的可執(zhí)行程序,那么該如何實(shí)現(xiàn)呢?其實(shí)是很簡單的,借助Windows API,簡單幾步即可完成:
1. 找到待嵌入的窗體句柄,使用WinAPI:
HWND FindWindowA(
[in, optional] LPCSTR lpClassName,
[in, optional] LPCSTR lpWindowName
);
參數(shù)的詳細(xì)描述如下圖所示:
從描述中可以看到,通過窗口的標(biāo)題來查找句柄是簡單可行的方式(當(dāng)有多個標(biāo)題相同的窗體時,需要用窗體類名來區(qū)分),但是此時 lpClassName需要傳入NULL值,但LabVIEW中并沒有辦法直接創(chuàng)建NULL值,參考官方給出的解決方案1是可行的(按照值傳遞的方式傳入0,大多數(shù)時候DLL會視作指針類型參數(shù)傳入的是NULL值),如下圖所示:
于是封裝 FindWindowA() 函數(shù)如下圖所示:
另外如果你想獲取任一窗體的類名和標(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ì)描述如下圖所示:
這兩個參數(shù)比較簡單,無需多解釋,封裝 SetParent() 函數(shù)如下圖所示:
那么如何獲取LabVIEW編寫的VI窗體句柄呢?這里提供兩種方式:
通過上面封裝的 FindWinowA() 函數(shù),傳入窗體標(biāo)題來獲取;
通過VI的Front Panel Window.Native Window屬性直接獲取,但是該屬性默認(rèn)是隱藏的,需要在LabVIEW.ini配置文件中加上:SuperSecretPrivateSpecialStuff=True,重啟LabVIEW即可;
有了上述兩個API其實(shí)就已經(jīng)可以把第三方exe嵌入到VI中了,但是窗體沒有重繪,效果可能是窗體已經(jīng)嵌入但是是空白的(如下圖所示),需要自己拖動一下窗口或調(diào)整其大小才能恢復(fù),另外嵌入時沒有辦法去控制嵌入的位置和窗體大小,顯然這并不夠完美,那么還需借助幾個API來達(dá)到理想的效果。
3. 獲取窗體的邊界尺寸,使用WinAPI:
BOOL GetWindowRect(
[in] HWND hWnd,
[out] LPRECT lpRect
);
參數(shù)詳細(xì)描述如下圖所示:
參數(shù)也比較簡單,只是第二個參數(shù)是一個結(jié)構(gòu)體指針,這里需要用一個空類型指針來接收,傳入適配類型簇(包含四個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ì)請參考官方描述,鏈接如下:
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ù)如下圖所示:
官方文檔中提到更改窗口的父級時,應(yīng)同步這兩個窗口的 UISTATE。有關(guān)詳細(xì)信息,請參閱WM_CHANGEUISTATE和WM_UPDATEUISTATE。封裝如下:
嵌入一個LabVIEW開發(fā)的可執(zhí)行程序如下圖所示:
嵌入Excel應(yīng)用程序如下圖所示:
-
LabVIEW
+關(guān)注
關(guān)注
1985文章
3665瀏覽量
329841 -
API
+關(guān)注
關(guān)注
2文章
1537瀏覽量
63061 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3309瀏覽量
58357
原文標(biāo)題:如何嵌入第三方可執(zhí)行程序
文章出處:【微信號:LabVIEW QT 修煉之路,微信公眾號:LabVIEW QT 修煉之路】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Labview如何內(nèi)嵌操作第三方EXE程序!
如何打開第三方軟件
如何把第三方庫加到PROTEUS中?
如何在LabVIEW中嵌入第三方軟件界面
第三方dll調(diào)用問題?。?!
LabVIEW與第三方軟件交互問題
國內(nèi)知名第三方檢測認(rèn)證機(jī)構(gòu)排名
關(guān)于LabVIEW調(diào)用第三方exe,如何去控制第三方exe按鈕的問題
頭文件中包含第三方文件
銀行和第三方支付:戀愛進(jìn)行時
基于第三方信號無源探測系統(tǒng)研究

評論