2008-09-25 8 views
8

Je veux faire un formulaire .NET en tant que TopMost Form pour une autre application externe (pas .NET liée, pure Win32) de sorte qu'il reste au-dessus de Win32App, mais pas le reste de la applications en cours d'exécution.Comment faire pour modifier un propriétaire de fenêtre en utilisant son handle

J'ai le handle de Win32App (fourni par le Win32App lui-même), et j'ai essayé Win32 SetParent() function, via P/Invoke in C#, mais alors mon .NET Form est confiné dans le Win32App et ce n'est pas ce que je veux.

Répondre

12

Je pense que vous cherchez est à P/Invoke SetWindowLongPtr(win32window, GWLP_HWNDPARENT, formhandle)

Google Search

+1

Le problème est que j'ai googlé avec le mot "changer le propriétaire de Windows" au lieu de chercher "changer le parent de Windows". :) –

+11

Je suis passé par cette réponse plusieurs fois en pensant qu'il répondait à la mauvaise question, jusqu'à ce que je lis ce qui suit dans les doc msdn: "" Vous ne devez pas appeler SetWindowLong avec l'index GWL_HWNDPARENT pour changer le parent d'une fenêtre enfant. Au lieu de cela, utilisez la fonction SetParent. »Cette déclaration est trompeuse: GWL_HWNDPARENT modifie le PROPRIÉTAIRE, pas le parent, d'une fenêtre.Il est sûr à utiliser à cette fin." – bj0

2

Oui! J'ai déjà une importation P/Invoke de SetWindowLongPtr (qui est sûr x64). Et en utilisant réflecteur Je cherchai sur la propriété Form.Owner (la get_Owner (valeur de formulaire) méthode) et a réussi à changer le propriétaire avec

SetWindowLongPtr(childHdl, -8, OwnerHdl) 

Je regardais ce que le -8 (0xFFFFFFFFFFFFFFF8) signifiait avant que je puisse poster la solution ici, mais Joel l'a déjà signalé.

Merci!

Questions connexes