如何将一个不受管理的对话框设置为WinForm表单的所有者?

我需要能够获得WinForm对话框的所有者的HWND。 在unmanaged中,我有一个后台线程获取前面窗口的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的所有者/父母吗?


为了用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可能会失败。 看到这里:为什么Control.FromHandle(IntPtr)在一个挂钩进程中返回null并返回“Form”的有效对象? 在另一个迷恋的过程?

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

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);
链接地址: http://www.djcxy.com/p/52087.html

上一篇: How do I set an umanaged dialog as the Owner of a WinForm Form?

下一篇: Refresh PyDev import paths in Eclipse