2011-04-18 1 views
7

Je dois pouvoir obtenir le HWND du propriétaire d'une boîte de dialogue WinForm. Dans non géré, j'ai un fil de fond qui obtient le HWND pour la fenêtre en face. Le code appelle ensuite :: GetParent (frontHWND) pour voir s'il doit masquer une autre boîte de dialogue MFC non modale. Lorsque la boîte de dialogue WinForm est frontHWND, je reçois toujours la valeur NULL pour l'appel GetParent. J'ai également essayé GetOwner réalisant que .Net a essayé de nettoyer la différence entre Parent et Propriétaire. En regardant la boîte de dialogue WinForm avec Spy ++, il est également dit que WinForm n'a pas de parent ou de propriétaire. Je l'ai transmisComment définir une boîte de dialogue en tant que propriétaire d'un formulaire WinForm?

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

Le code ci-dessus n'a pas défini le propriétaire de WinForm. J'ai essayé d'appeler le SetParent Win32 à partir du code WinForm dans OnFormShown(), mais le verrouillé l'application MFC et le WinForm. Est-ce que quelqu'un peut expliquer comment faire en sorte que mon dialogue/application non géré soit le propriétaire/parent du winform managé?

+0

Toute information sera utile ... comme ce que ShowDialog (IWin32Window) définit en fait. D'après ce lien, [link] (http://stackoverflow.com/questions/395186/difference-between-owner-property-and-showdialogiwin32window-owner), il devrait définir le propriétaire, mais quand j'utilise Spy ++, je ne sais pas Je vois ça. – Byron

Répondre

4

Pour afficher une forme de C# avec un parent C++ Je fais ceci:

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

ce code est mis dans un emballage C++/CLI DLL. J'espère que cela aide.

Edit: "w" doit être testé contre nullptr, parce que contrôle :: FromHandle pourrait échouer. Voir ici: Why Control.FromHandle(IntPtr) returns null in one hooked process and returns valid object of "Form"? in another hooked process?

Ainsi, fail-safe code serait:

if (w == nullptr) 
     d->Show(); 
    else 
     d->Show(w); 
Questions connexes