如何将c#窗口(窗体)句柄传递给VB6项目或表单?

时间:2015-07-04 16:14:09

标签: c# vb6

我们有一个应用程序,我们在点击按钮时从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

2 个答案:

答案 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()的代码。