Как установить неуправляемое диалоговое окно в качестве владельца формы WinForm?

Мне нужно иметь возможность получить HWND владельца диалога WinForm. В неуправляемом у меня есть фоновый поток, который получает HWND для окна впереди. Затем код вызывает::GetParent(frontHWND), чтобы увидеть, нужно ли скрывать другое немодальное диалоговое окно MFC. Когда диалоговое окно WinForm является frontHWND, я всегда возвращаю NULL для вызова GetParent. Я также пробовал GetOwner, понимая, что.Net пытался убрать разницу между Родителем и Владельцем. Глядя на диалог WinForm с Spy++, он также говорит, что WinForm не имеет ни родителя, ни владельца. Я прошел в

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

Приведенный выше код не установил владельца WinForm. Я пытался вызвать Win32 SetParent из кода WinForm в OnFormShown(), но заблокировал приложение MFC и WinForm.

Может кто-нибудь объяснить, как сделать так, чтобы мое неуправляемое диалоговое окно / приложение было владельцем / родителем управляемой winform?

1 ответ

Чтобы показать форму 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);
}

этот код помещается в DLL-оболочку C++ / CLI. Надеюсь это поможет.

Редактировать: "w" должен быть проверен на nullptr, потому что Control::FromHandle может завершиться ошибкой. Смотрите здесь: Почему Control.FromHandle(IntPtr) возвращает ноль в одном подключенном процессе и возвращает действительный объект "Form"? в другом подключенном процессе?

Итак, отказоустойчивый код будет:

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);
Другие вопросы по тегам