VB.NET窗体嵌入

MIAIONE 2018-10-27 11:13:32
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窗体都关闭

...全文
388 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj_zwl 2018-11-11
  • 打赏
  • 举报
回复
先用findwindow找到窗口,再用setparent设置,窗口大小变化时再调用movewindow改变大小
良朋 2018-11-06
  • 打赏
  • 举报
回复
都用2017了,去vb.net论坛啊,.net开发下面,别再VB这里了。
MIAIONE 2018-10-31
  • 打赏
  • 举报
回复
话说,findwindows真的可以找到吗?
舉杯邀明月 2018-10-29
  • 打赏
  • 举报
回复
1. 任何1个窗体都有句柄!!!  

2. 即使“无边框窗体”,也有“窗口标题”的!
  窗口标题,跟“窗口标题栏”是两回事 …………

3. 如果是“同一种窗口”、并且“窗口标题”也是相同的,
  那么无法保证 FindWindow( ) 找到的是具体是哪个……
  但可以用 FindWindowEx( )来枚举“所有符合查找条件”的窗口,
 只不过,要“确认”具体哪个才是你想找的,只能你自己设法来判断!
 别人根本不可能“帮你猜”用什么方式可以判断 ……  
舉杯邀明月 2018-10-28
  • 打赏
  • 举报
回复
你说的“真的不管用”,最大的可能就是你的 FindWindow( )没有找到窗口!

你的第1段代码:
h = FindWindow(vbNullString, "c:\windows\system32\cmd.exe")
第2个参数,要求是“窗口标题”;
但cmd.exe的窗口标题,没有用它的“绝对路径”作为标题的吧!
基本都是:“命令提示符”、“管理员:命令提示符”之类的吧!!!
  或者是刚才说的那两个再加上“ - xxxxxx”(xxxx是正在执行的命令或者外部程序名称)。

别的不说了,首先你“窗口句柄”都没有正确获取,后面的一切都是“废话”……
建议你在 FindWindow( )之后,验证一下是否找到句柄了吧!
不要“不管它是否执行成功,我都当它是成功的”来处理………… 
MIAIONE 2018-10-28
  • 打赏
  • 举报
回复
可是如果这个窗体没有句柄怎么办,我使用VB编写的时候都是无边框,所以标题自然都没有,那么这个要怎么抓这个句柄呢?
脆皮大雪糕 2018-10-28
  • 打赏
  • 举报
回复
正如楼上所说
另外,建议你使用spy之类的程序用鼠标摸一下你想要的窗体,看看抓到的句柄到底是多少,然后你再findwindow看看找到的窗体句柄是多少,是否一致

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧