如何将非托管对话框设置为WinForm表单的所有者?

时间:2011-04-18 15:03:53

标签: c# c++ interop winforms-interop

我需要能够获得WinForm对话框的所有者的HWND。在非托管中,我有一个后台线程,它获取前面窗口的HWND。然后代码调用:: GetParent(frontHWND)以查看是否需要隐藏不同的非模态MFC对话框。当WinForm对话框是frontHWND时,我总是为GetParent调用返回NULL。我也试过GetOwner意识到.Net试图清理父和所有者之间的区别。查看带有Spy ++的WinForm对话框,它还说WinForm没有父级或所有者。我已经通过了

NativeWindow ^natWin = gcnew NativeWindow();
natWin->AssignHandle(IntPtr(hwndParent));
managedDlg->ShowDialog(natWin);

上面的代码没有设置WinForm的所有者。我尝试从OnFormShown()中的WinForm代码调用Win32 SetParent,但锁定了MFC应用程序和WinForm。

有人可以解释如何让我的非托管对话框/应用程序成为托管winform的所有者/父级吗?

1 个答案:

答案 0 :(得分:5)

要使用C ++父级显示C#表单,请执行以下操作:

void GUIWrapper(HWND parent)
{
    System::IntPtr myWindowHandle = System::IntPtr(parent);
    System::Windows::Forms::IWin32Window ^w = System::Windows::Forms::Control::FromHandle(myWindowHandle);
    ManagedDialog::ManagedDialogGUI ^d = gcnew ManagedDialog::ManagedDialogGUI();
    d->Show(w);
}

此代码放在C ++ / CLI包装器DLL中。 希望这会有所帮助。

编辑:“w”必须针对 nullptr 进行测试,因为 Control :: FromHandle 可能会失败。看这里: Why Control.FromHandle(IntPtr) returns null in one hooked process and returns valid object of "Form"? in another hooked process?

因此,故障安全代码将是:

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);