LabVIEW:2015
你可能碰到過這種需求:需要在自己開發(fā)的應用程序中嵌入某個第三方的可執(zhí)行程序,那么該如何實現(xiàn)呢?其實是很簡單的,借助Windows API,簡單幾步即可完成:
1. 找到待嵌入的窗體句柄,使用WinAPI:
HWND FindWindowA(
[in, optional] LPCSTR lpClassName,
[in, optional] LPCSTR lpWindowName
);
參數(shù)的詳細描述如下圖所示:
從描述中可以看到,通過窗口的標題來查找句柄是簡單可行的方式(當有多個標題相同的窗體時,需要用窗體類名來區(qū)分),但是此時 lpClassName需要傳入NULL值,但LabVIEW中并沒有辦法直接創(chuàng)建NULL值,參考官方給出的解決方案1是可行的(按照值傳遞的方式傳入0,大多數(shù)時候DLL會視作指針類型參數(shù)傳入的是NULL值),如下圖所示:
于是封裝 FindWindowA() 函數(shù)如下圖所示:
另外如果你想獲取任一窗體的類名和標題名,借用Spy++工具是很容易的,可以自行搜索下載,當然如果你按照了Visual Studio也是帶的有的,如下圖所示:
比如將查找程序工具拖拽到TEST.exe的窗體標題欄上,如下圖所示:
2.設(shè)置帶嵌入窗體的父窗體,使用WinAPI:
HWND SetParent(
[in] HWND hWndChild,
[in, optional] HWND hWndNewParent
);
參數(shù)的詳細描述如下圖所示:
這兩個參數(shù)比較簡單,無需多解釋,封裝 SetParent() 函數(shù)如下圖所示:
那么如何獲取LabVIEW編寫的VI窗體句柄呢?這里提供兩種方式:
通過上面封裝的 FindWinowA() 函數(shù),傳入窗體標題來獲?。?/p>
通過VI的Front Panel Window.Native Window屬性直接獲取,但是該屬性默認是隱藏的,需要在LabVIEW.ini配置文件中加上:SuperSecretPrivateSpecialStuff=True,重啟LabVIEW即可;
有了上述兩個API其實就已經(jīng)可以把第三方exe嵌入到VI中了,但是窗體沒有重繪,效果可能是窗體已經(jīng)嵌入但是是空白的(如下圖所示),需要自己拖動一下窗口或調(diào)整其大小才能恢復,另外嵌入時沒有辦法去控制嵌入的位置和窗體大小,顯然這并不夠完美,那么還需借助幾個API來達到理想的效果。
3. 獲取窗體的邊界尺寸,使用WinAPI:
BOOL GetWindowRect(
[in] HWND hWnd,
[out] LPRECT lpRect
);
參數(shù)詳細描述如下圖所示:
參數(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ù)詳細描述如下圖所示:
封裝如下圖所示:
5.? ?
5.更改指定窗口的屬性,使用WinAPI:
LONG SetWindowLongA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG dwNewLong
);
詳細參數(shù)描述如下圖所示:
關(guān)于窗口樣式有很多種,這里不便展出,詳細請參考官方描述,鏈接如下:
https://learn.microsoft.com/zh-cn/windows/win32/winmsg/window-styles
封裝如下圖所示:
6. 指定窗體的顯示狀態(tài),使用WinAPI:
BOOL ShowWindow(
[in] HWND hWnd,
[in] int nCmdShow
);
詳細參數(shù)描述如下圖所示:
封裝如下圖所示:
7.發(fā)送指定消息到窗口,使用WinAPI:
LRESULT SendMessageA(
[in] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
詳細參數(shù)如下圖所示:
官方文檔中提到更改窗口的父級時,應同步這兩個窗口的 UISTATE。有關(guān)詳細信息,請參閱WM_CHANGEUISTATE和WM_UPDATEUISTATE。封裝如下:
嵌入一個LabVIEW開發(fā)的可執(zhí)行程序如下圖所示:
嵌入Excel應用程序如下圖所示:
-
LabVIEW
+關(guān)注
關(guān)注
1971文章
3654瀏覽量
323567 -
API
+關(guān)注
關(guān)注
2文章
1500瀏覽量
62011 -
應用程序
+關(guān)注
關(guān)注
37文章
3268瀏覽量
57704
原文標題:如何嵌入第三方可執(zhí)行程序
文章出處:【微信號:LabVIEW QT 修煉之路,微信公眾號:LabVIEW QT 修煉之路】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論