Как установить неуправляемое диалоговое окно в качестве владельца формы 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);