2011-04-18 17 views
7

Necesito poder obtener un HWND del propietario del diálogo WinForm. En unmanaged tengo un hilo de fondo que obtiene el HWND para la ventana en el frente. A continuación, el código llama a :: GetParent (frontHWND) para ver si necesita ocultar un cuadro de diálogo MFC no modal diferente. Cuando el cuadro de diálogo de WinForm es frontHWND, siempre obtengo NULL para la llamada de GetParent. También he intentado que GetOwner se dé cuenta de que .Net intentó limpiar la diferencia entre el padre y el propietario. Mirando el diálogo WinForm w/Spy ++, también dice que WinForm no tiene padre o dueño. He pasado en¿Cómo configuro un diálogo umanaged como el propietario de un formulario de WinForm?

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

El código anterior no ha configurado al propietario de WinForm. Intenté llamar a Win32 SetParent desde el código de WinForm en OnFormShown(), pero bloqueé la aplicación MFC y WinForm.

¿Alguien me puede explicar cómo conseguir que mi diálogo/aplicación no administrado sea el propietario/padre del winform administrado?

+0

Cualquier información será útil ... como lo ShowDialog (IWin32Window) establece realidad. De acuerdo con este enlace, [link] (http://stackoverflow.com/questions/395186/difference-between-owner-property-and-showdialogiwin32window-owner), debería estar configurando al propietario, pero cuando utilizo Spy ++ no lo hago. T ver eso. – Byron

Respuesta

4

Para mostrar una forma de C# con una matriz C++ hago esto:

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

este código se pone en un C++/CLI envoltura DLL. Espero que esto ayude.

Editar: "w" debe ser probado contra nullptr, porque control :: FromHandle podría fallar. Ver aquí: Why Control.FromHandle(IntPtr) returns null in one hooked process and returns valid object of "Form"? in another hooked process?

Por lo tanto, el código de prueba de fallos sería:

if (w == nullptr) 
     d->Show(); 
    else 
     d->Show(w); 
Cuestiones relacionadas