Nous développons un gestionnaire de mise en page dans WPF qui possède des fenêtres d'affichage qui peuvent être déplacées/réduites en taille/etc par un utilisateur. Les fenêtres sont normalement remplies de données (images/films/etc) via des fournisseurs qui sont sous notre contrôle dans le gestionnaire de mise en page. Mon travail consiste à examiner s'il est également possible d'héberger une application Windows externe (par exemple notepad, calc, adobe reader, etc.) dans une fenêtre. Je rencontre un certain nombre de problèmes.
La plupart des ressources indiquent qu'il faut utiliser la classe HwndHost. J'expérimente avec ce guide de Microsoft lui-même : http://msdn.microsoft.com/en-us/library/ms752055.aspx
J'ai adapté ce système de façon à ce que la boîte de liste soit remplacée par la poignée Windows de l'application externe. Quelqu'un peut-il m'aider à répondre à ces questions ?
- Le guide ajoute une sous-fenêtre statique supplémentaire dans laquelle l'option
ListBox
est placé. Je ne pense pas avoir besoin de cela pour les applications externes. Si je l'omet, je dois faire de l'application externe une fenêtre enfant (en utilisant Get/SetWindowLong de user32.dll pour définir les paramètres de la fenêtre enfant).GWL_STYLE
commeWS_CHILD
). Mais si je fais cela, la barre de menu de l'application disparaît (à cause de l'optionWS_CHILD
) et il ne reçoit plus d'entrée. - Si j'utilise la sous-fenêtre, et que je fais de l'application externe un enfant de celle-ci, les choses fonctionnent raisonnablement, mais parfois l'application externe ne se peint pas correctement.
- J'ai également besoin que la fenêtre enfant soit redimensionnée en fonction de la fenêtre d'affichage. Cela est-il possible ?
- Lorsque l'application externe génère une fenêtre enfant (par exemple Notepad->Help->About), cette fenêtre n'est pas hébergée par l'application externe.
HwndHost
(et peut donc être déplacé en dehors de la fenêtre d'affichage). Existe-t-il un moyen d'empêcher cela ? - Puisque je n'ai pas besoin d'interaction supplémentaire entre l'application externe et le gestionnaire de mise en page, ai-je raison de supposer que je n'ai pas besoin d'attraper et de transmettre des messages ? (le guide ajoute un HwndSourceHook à la sous-fenêtre afin d'intercepter les changements de sélection dans la boîte de liste).
- Lorsque vous exécutez l'exemple (non modifié) VS2010 et que vous fermez la fenêtre, VS2010 ne voit pas que le programme s'est terminé. Si vous faites un break-all, vous vous retrouvez en assembly sans source. Il y a quelque chose qui sent mauvais, mais je ne le trouve pas.
- Le guide lui-même semble être très mal codé, mais je n'ai pas trouvé de meilleure documentation à ce sujet. D'autres exemples ?
- Une autre approche consiste à ne pas utiliser
HwndHost
maisWindowsFormHost
comme discuté ici . Cela fonctionne (et c'est beaucoup plus simple !) mais je n'ai pas le contrôle de la taille de l'application ? De plus, WinFormHost n'est pas vraiment conçu pour cela ?
Merci pour toute indication dans la bonne direction.
0 votes
Bonjour, je choisirais sans aucun doute le point 8.