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

发布于 2024-11-02 06:00:26 字数 583 浏览 0 评论 0原文

我需要能够获取 WinForm 对话框的所有者的 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 的所有者/父级吗?

I need to be able to get a WinForm dialog's Owner's HWND. In unmanaged I have a background thread that gets the HWND for the window in front. The code then calls ::GetParent(frontHWND) to see if it needs to hide a different non-modal MFC dialog. When the WinForm dialog is the frontHWND, I always get NULL back for the GetParent call. I have also tried GetOwner realizing .Net tried to cleanup the difference between Parent and Owner. Looking at the WinForm dialog w/ Spy++, it also say the WinForm has no parent or owner. I have passed in

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

The above code didn't set the owner of the WinForm. I tried calling the Win32 SetParent from the WinForm code in OnFormShown(), but the locked up the MFC application and the WinForm.

Can someone explain how to get my unmanaged dialog/app to be the owner/parent of the managed winform?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葵雨 2024-11-09 06:00:26

为了显示具有 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);

To show a C# form with a C++ parent I do this:

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);
}

this code is put in a C++/CLI wrapper DLL.
Hope this helps.

Edit: "w" must be tested against nullptr, because Control::FromHandle could fail. See here:
Why Control.FromHandle(IntPtr) returns null in one hooked process and returns valid object of "Form"? in another hooked process?

So, fail-safe code would be:

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文