7

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

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

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

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

4

1 回答 1

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可能会失败。请参阅此处: 为什么 Control.FromHandle(IntPtr) 在一个挂钩进程中返回 null 并返回“Form”的有效对象?在另一个上瘾的过程中?

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

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);
于 2011-07-12T14:44:17.947 回答