2010-03-08 4 views
2

J'essaie d'obtenir une parenté correcte pour mon formulaire C# dans une application tierce, j'ai le contrôle du contrôle auquel j'aimerais que mon formulaire soit parent mais ne puisse tout simplement pas semblent le faire fonctionner.Création d'une fenêtre en tant qu'enfant dans une application tierce

alt text http://img693.imageshack.us/img693/8871/examplec.jpg

Je voudrais créer ma forme afin qu'elle fait partie de la MDIClient, la poignée 005E0ED6. Tout comme la fenêtre 01D7157D.

Est-ce possible? Si oui, peut-il être fait en C#?

Répondre

2

Comment avez-vous essayé? Avez-vous essayé SetParent? Consultez la question StackOverflow suivante pour voir si cela aide. Embedding HWND into external process using SetParent

+0

Oui J'ai essayé de définir Parent, mais mon formulaire est créé en dehors de MDIClient et ne semble pas vouloir en faire partie. –

+0

Pouvez-vous montrer le code? – Josh

+0

Ahh je n'ai pas vu cette question, j'y jette un coup d'oeil. –

1

Ce code semble fonctionner:

[DllImport("user32.dll")] 
    private static extern 
     IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 

    [DllImport("user32.dll")] 
    private static extern 
     IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach); 

     WinAPI.SetParent(this.Handle, otherappshandle); 

     IntPtr otherprocessID = GetWindowThreadProcessId(otherappshandle, new IntPtr(0)); 
     IntPtr threadID = new IntPtr(AppDomain.GetCurrentThreadId()); 

     AttachThreadInput(threadID , otherprocessID , 1); 
+0

Cette variable doit être nommée 'otherThreadID' plutôt que' otherprocessID', car la valeur de retour de 'GetWindowThreadProcessId()' est un ID de thread – torvin

0

Bonne chance. Je suis descendu cette route, et j'ai trouvé qu'il y avait assez de petits pièges irritants que j'ai fini par abandonner.

SetParent() et comme vous obtiendrez partie du chemin, mais il y a un tas de petits trucs à regarder aussi loin que l'ensemble du système (pompe de blocage des messages, etc.) qui vient de faire un puits de temps . Avec WinForms, en particulier, je recommande fortement d'exécuter simplement votre interface utilisateur dans le processus principal (si vous le pouvez), et si vous voulez isoler votre traitement dans un autre processus, faites-le à la place.