我们有一个应用程序,我们在点击按钮时从c#表单启动VB模式对话框。即使VB对话框是模态窗口,我们也可以在单击时返回C#对话框,然后应用程序挂起。
看起来VB6表单没有父级,因此问题。所以我们决定将表单句柄从c#传递给VB,并将我们的c#对话框作为VB对话框的父对象。任何帮助或示例代码都会非常感激。
点击我们的c#对话框后,我们称之为:
gPMSearch.Search();
Search类在VB中:
Private Sub Class_Initialize()
'Load the search form
Set Form = New frmMain
Load Form
End Sub
表单加载如下:
Me.Show vbModal
答案 0 :(得分:0)
在窗口创建时设置窗口的所有权。帮助说无法更改。
拥有Windows 重叠或弹出窗口可以由另一个重叠或弹出窗口拥有。拥有在窗口上设置了几个约束。
拥有的窗口始终位于z顺序的所有者之上。 当系统所有者被销毁时,系统会自动销毁拥有的窗口。 拥有的窗口在其所有者最小化时隐藏。
只有重叠或弹出窗口才能成为所有者窗口;子窗口不能是所有者窗口。应用程序在创建具有WS_OVERLAPPED或WS_POPUP样式的窗口时,通过将所有者的窗口句柄指定为CreateWindowEx的hwndParent参数来创建自有窗口。 hwndParent参数必须标识重叠或弹出窗口。如果hwndParent标识子窗口,则系统将所有权分配给子窗口的顶级父窗口。创建拥有的窗口后,应用程序无法将窗口的所有权转移到另一个窗口。
默认情况下,对话框和消息框是拥有的窗口。应用程序在调用创建对话框或消息框的函数时指定所有者窗口。
应用程序可以使用带有GW_OWNER标志的GetWindow函数来检索窗口所有者的句柄。
这些是在进程中还是在进程外VB6。你不能从C#
中调用VB6表单(而不是子表单)无论如何,你需要编写模拟你想要的行为的愚蠢代码。监控他们的Z订单并根据需要进行更改。
所以我每隔50ms在C#中放一个计时器。如果测试C#是否为活动窗口,如果是,则使VB6处于活动状态。
答案 1 :(得分:-1)
重点是致电ShowDialog
,而不仅仅是Show
。
'Assuming that `MyModalDialogForm` is a c# object
Dim modalDialog = New MyModalDialogForm()
modalDialog.ShowDialog(Me)
将Me
作为所有者传递也可确保模态对话框保持在另一个表单的顶部。
如果您需要结果:
Dim modalDialog = New MyModalDialogForm()
If modalDialog.ShowDialog(Me) = DialogResult.Ok Then
...
End If
然而;如果对话框由gPMSearch.Search();
打开,则无法影响VB6中表单的行为。您将在C#中修改gPMSearch.Search()
的代码。