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