2009-09-01 7 views
1

Je développe une application C# WPF qui corrige la fenêtre principale d'une autre application à l'aide d'un appel à Win32 SetParent(). Le handle de cette fenêtre enfant out-of-process est enveloppé par une classe nommée FormHost qui est dérivée de HwndHost. Tout fonctionne bien, sauf pour une chose: les messages pour la fenêtre réparée ne sont pas livrés à FormHost. La documentation MSDN indique clairement que la procédure de fenêtre HwndHost WndProc() ne peut pas être utilisée avec des fenêtres hors processus. L'alternative, MessageHook ne fonctionne pas non plus. J'ai également essayé d'appeler AttachThreadInput() pour combiner le traitement d'entrée des deux fenêtres. Pas de chance. Aucune suggestion?Traitement des messages pour la fenêtre à partir d'un autre processus

Répondre

2

Le processus qui reparente la fenêtre ne peut pas directement sous-classer la procédure de message d'une fenêtre hors processus. Il devrait injecter son propre code de procédure de fenêtre dans l'espace d'adressage du processus propriétaire de la fenêtre, sous-classer la fenêtre dans cet espace d'adressage, puis enfin utiliser un mécanisme IPC de votre choix pour communiquer avec le processus de reparent selon les besoins.

Pour l'injection réelle, vous pouvez:

1) mettre le code de procédure de fenêtre réelle dans une DLL, utilisez CreateRemoteThread() pour charger la DLL dans le processus propriétaire de la fenêtre, et ensuite DllEntryPoint de la DLL () sous-classe la fenêtre (vous devez stocker le handle HWND dans la mémoire globale quelque part afin que la DLL puisse le trouver). 2) placer le code de procédure de fenêtre réel dans un bloc de mémoire alloué dans l'espace d'adressage du processus propriétaire de la fenêtre en utilisant VirtualAllocEx() et WriteProcessMemory(), puis utiliser CreateRemoteThread() pour exécuter la sous-classe réelle de la fenêtre utiliser ce bloc de mémoire comme procédure de fenêtre.

+0

upvoted - bonne réponse. Toutefois, l'option 2 fonctionnera-t-elle sous Windows Vista et plus lorsque le DEP est activé? – quixver

+0

nvm - VirtualProtectEx permet également de définir la protection de la mémoire. – quixver

Questions connexes