Lancer programme externe dans winform

goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007 - 29 oct. 2007 à 15:14
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007 - 30 oct. 2007 à 08:50
Bonjour à tous,


J'essaie de lancer un programme externe à partir d'une winform. Et je souhaiterai que la fenetre du programe externe apparaisse dans un panel (ou un autre container) de ma winform principale.
J'ai fais ceci :
//Class qui lance le programme externe dans un panel : ici notepad
publicclass ProcessOxymetre
{
//Attributs
private Process p;
public Panel panelOxymetre;
 
//Constructeur
public ProcessOxymetre()
{
            initPanel();
}
 
//Ajout de la fonction SetParent de l'API user32
[DllImport("user32.dll", CharSet = CharSet.Auto)]
publicstaticextern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
 
//Initialisation du panel : taille, position ...
publicvoid initPanel()
{
            panelOxymetre = new System.Windows.Forms.Panel();
            panelOxymetre.SuspendLayout();
//...
}
 
publicvoid afficherPanelOxymetre()
{
            panelOxymetre.ResumeLayout(false);
            panelOxymetre.PerformLayout();
            panelOxymetre.Show();
            panelOxymetre.Visible = true;
}
 
publicvoid lauchNotePad()
{
try
{
                p = null;
                p = new Process();
                p.StartInfo.FileName = "notepad.exe";
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                Win32.SetParent(p.MainWindowHandle, panelOxymetre.Handle);
                p.WaitForExit();
}
catch(Exception ex)
{
                MessageBox.Show("Erreur : "+ex.ToString(), "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
}
 
 
//Class avec la form principale
publicclass frmMainWindow : Form
{
        ProcessOxymetre pOxy;
 
public frmMainWindow()
{
            InitializeComponent();
 
//Init panel && ajout a la form
            pOxy = new ProcessOxymetre();
this.Controls.Add(pOxy.panelOxymetre);
}
 
//Clique sur bouton de lancement du pgm externe
privatevoid btn_clicked(object sender, EventArgs e)
{
//On lance notepad++ et on rend visible le panel
            pOxy.lauchNotePad();
            pOxy.afficherPanelOxymetre();
}
}
 


Avec ce code notepad apparait bien dans mon panel.
Le problème c'est que j'ai toujours deux fenêtres differentes :

- ma form principal

- notepad (qui reste affiche quand je reduis ma form principale)

De plus mon appli beug : ll y a d'autre composants dans ma winform et ils disparaissent dés ke je bouge la fenêtre de notepad.


Je souhaiterai avoir 2 applis en une seule car le but final de mon appli est de créer une interface graphique qui gère plusieurs capteurs et
affiche le resultat de leurs mesures.

Etant donné que ces capteurs doivent être utilisé avec leurs logiciels
propriétaires, le but de mon appli et de faire une espèce de plateforme
de centralisation! (pour ne pas avoir plein de logiciel qui tourne dans
tous les sens)

Je ne sais pas si tout cela est possible du coup ?

Si quelqu'un adeja réalisé ce genre de chose je suis preneur.
Merci d'avance.

2 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 11
29 oct. 2007 à 16:26
Tu ne pourras pas lancer Notepad dans une de tes formes, ni aucune autre application qui n'a pas été prévue pour.

Pour faire ce que tu veux faire, tu n'a plus qu'a espérer que les logiciels propriétaires utilisés fournissent des APIs te permettant de récuperer les informations dont tu as besoin et/ou de les piloter depuis ton application.

Mais si les logiciels propriétaires en question n'ont pas été prévus pour ça, je pense que tu vas avoir du mal à les 'inclure' dans ton application...

Tout dépend aussi de ce que ton application centrale doit faire : afficher des données ? piloter les logiciels ? juste démarrer/arréter les logiciels ? etc.


Working as designed
www.nikoui.fr
0
goddet Messages postés 6 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 5 novembre 2007
30 oct. 2007 à 08:50
Merci pour ta réponse! Mon application doit normalement afficher le résultat des mesures de chaque capteur (juste lancer et arréter les logiciels).
Ces mesures sont stocké dans des fichiers xml (dont je connais l'emplacement).
Je n'ai qu'à lire le fichier xml et mettre à jour les labels dans mon interface graphique.
Je souhaites cependant afficher les fenêtres des logiciels pour m'assurer du bon déroulement de la mesure.
0