2010-04-09 5 views
6

Vous ne savez pas si c'est possible mais existe-t-il un moyen d'ouvrir un autre programme comme le bloc-notes dans le conteneur d'une fenêtre WPF? Similaire à celui d'être capable d'ouvrir une page web en utilisant le contrôle webbrowser?WPF ouvrant le programme exe dans la fenêtre WPF

Fondamentalement je voudrais ouvrir le bloc-notes ou autre exe mais le garder contraint dans le conteneur de fenêtre de WPF using le code de xaml/C#? pas sûr si possible?

Répondre

1

a réussi à le faire en utilisant la méthode SetParent

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetParent(IntPtr hwc, IntPtr hwp); 

donc en obtenant les poignées pour fenêtre WPF puis la fenêtre exe, j'ai pu régler la fenêtre de WPF comme parent il a donné une simulation d'être intégré (également fermé la barre de titre, etc.)

reçu de l'aide d'ici: http://channel9.msdn.com/forums/TechOff/250417-Hide-window-caption-in-c/

+0

Glad cela a fonctionné pour vous. Il a deux limitations dont vous devez être conscient: 1. La barre de titre, le bouton de fermeture, etc, ne s'affichent pas ainsi il ne ressemble pas à une fenêtre, et 2. Il provoque des échecs d'application dans les applications qui dépendent des événements NC_, qui peignent dans la zone non-client, ou qui balaient leur arborescence pour trouver la fenêtre racine. L'autre technique est moins invasive et plus universelle et offre également la possibilité de cacher la zone non-client si désiré. –

-1

Vous ne pouvez pas faire cela. La raison pour laquelle vous pouvez afficher une page Web est parce que IE a été conçu en utilisant une architecture qui le permet - le moteur de rendu ne fait pas partie de l'exécutable IE actuel, mais une DLL qui expose un composant.

Les fichiers EXE génériques ne fonctionnent pas de cette façon, et vous ne pouvez pas les intégrer dans votre application.

+1

Mais vous pouvez ** ** faire. Vois ma réponse. –

6

Oui, c'est possible.

Tout ce que vous avez à faire est:

  1. Créer une WindowsFormsHost et l'ajouter à un panneau dans votre interface utilisateur
  2. Démarrer le processus (tel que le Bloc-notes) utilisant le processus d'appel Process.Start
  3. . WaitForInputIdle
  4. Utilisez process.MainWindowHandle pour obtenir le handle de fenêtre
  5. appel SetWindowPos pour définir la fenêtre du processus aux coordonnées et Z Ordre de la fenêtre HwndHost
  6. crochet à la fois le HwndHost et le process.MainWindowHandle pour détecter les changements de taille et répétez l'étape 5.

Il est assez simple de faire tout cela. L'effet est que toute la fenêtre Bloc-notes (ou l'application que vous avez démarrée) apparaît et se comporte exactement comme si elle faisait partie de votre application WPF.

+0

WaitForInputIdle attend que tout thread devienne inactif, pas seulement le thread graphique. –

+0

@Sheng: Bon point. Ce qui précède fonctionne pour une application simple comme le Bloc-notes, mais pour une application plus complexe, il peut être nécessaire de remplacer l'étape 4 par du code qui utilise régulièrement EnumWindows pour rechercher une fenêtre avec une valeur retournée par GetWindowThreadProcessId visible et sans parent. Dans tous les cas, il est toujours possible d'utiliser XAML/C#. –