VB.NET父表單MDI嵌入子表單
首先,真的是不管用,打開后仍然在外面,求嵌入第三方應用程式表單辦法
注意我的編譯器:VisualStudio2017 和語言 VB.NET
[
Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
System.Diagnostics.Process.Start("c:\windows\system32\cmd.exe")
System.Threading.Thread.Sleep(50) '我發現,不休息的話,下面的FindWindow有可能找不到表單
Dim h As IntPtr
h = FindWindow(vbNullString, "c:\windows\system32\cmd.exe")
SetParent(h, Me.Panel1.Handle) '嵌套到panel1內
'SetParent(h, Me.Handle) '或者直接嵌套到表單內
End Sub
Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Int32, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Int32) As Int32
Private Const WM_SYSCOMMAND As Int32 = &H112
Private Const SC_MAXIMIZE As Int32 = &HF030
Private Const SC_MINIMIZE As Int32 = &HF020
Private Const SC_RESTORE As Int32 = &HF120
Public Const SW_HIDE = 0
Public Const SW_SHOW = 5
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Int32, ByVal nCmdShow As Int32) As Int32
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ShellExecute(Me.Panel1.Handle, "open", "c:\windows\system32\cmd.exe", Nothing, ".", SW_HIDE)
System.Threading.Thread.Sleep(50) '我發現,不休息的話,下面的FindWindow有可能找不到表單
Dim h As IntPtr = FindWindow(Nothing, "c:\windows\system32\cmd.exe")
ShowWindow(h, SW_HIDE)
SetParent(h, Me.Panel1.Handle) '嵌套到panel1內
SendMessage(h, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
End Sub
有能力的幫我解決下下面這些問題
還有,如果父表單支持縮放,但這個子表單最小化后會在左下角成條狀,但是,在這時如果螢屏解析度繼續小的情況下,就看不見了
有什么方法可以讓它最小化并在我的toolbar上自動新建一個按鈕并查找子表單標題替換為名稱,關閉后自動移除按鈕
當父程式關閉時,所有外部exe表單都關閉
uj5u.com熱心網友回復:
你說的“真的不管用”,最大的可能就是你的 FindWindow( )沒有找到視窗!你的第1段代碼:
h = FindWindow(vbNullString, "c:\windows\system32\cmd.exe")
第2個引數,要求是“視窗標題”;
但cmd.exe的視窗標題,沒有用它的“絕對路徑”作為標題的吧!
基本都是:“命令提示符”、“管理員:命令提示符”之類的吧!!!
或者是剛才說的那兩個再加上“ - xxxxxx”(xxxx是正在執行的命令或者外部程式名稱)。
別的不說了,首先你“視窗句柄”都沒有正確獲取,后面的一切都是“廢話”……
建議你在 FindWindow( )之后,驗證一下是否找到句柄了吧!
不要“不管它是否執行成功,我都當它是成功的”來處理…………
uj5u.com熱心網友回復:
正如樓上所說另外,建議你使用spy之類的程式用滑鼠摸一下你想要的表單,看看抓到的句柄到底是多少,然后你再findwindow看看找到的表單句柄是多少,是否一致
uj5u.com熱心網友回復:
可是如果這個表單沒有句柄怎么辦,我使用VB撰寫的時候都是無邊框,所以標題自然都沒有,那么這個要怎么抓這個句柄呢?uj5u.com熱心網友回復:
1. 任何1個表單都有句柄!!!
2. 即使“無邊框表單”,也有“視窗標題”的!
視窗標題,跟“視窗標題欄”是兩回事 …………
3. 如果是“同一種視窗”、并且“視窗標題”也是相同的,
那么無法保證 FindWindow( ) 找到的是具體是哪個……
但可以用 FindWindowEx( )來列舉“所有符合查找條件”的視窗,
只不過,要“確認”具體哪個才是你想找的,只能你自己設法來判斷!
別人根本不可能“幫你猜”用什么方式可以判斷 ……

uj5u.com熱心網友回復:
話說,findwindows真的可以找到嗎?uj5u.com熱心網友回復:
都用2017了,去vb.net論壇啊,.net開發下面,別再VB這里了。uj5u.com熱心網友回復:
先用findwindow找到視窗,再用setparent設定,視窗大小變化時再呼叫movewindow改變大小轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/42069.html
標籤:VB基礎類
上一篇:vb.net呼叫vbs
