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

Мне нужно иметь возможность получить 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 Ответ

5 голосов
/ 12 июля 2011

Чтобы показать форму 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...