IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Anomalie du Composant Process


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut [C#] Anomalie du Composant Process
    Bonjour,

    Windows XP SP2
    FrameWork 2.0
    Visual C# Express 2005

    Voilà j'ai une application Windows Form, avec une Form qui contient un composant Process.
    Ce composant est intialisé de la manière suivante dans la procédure InitializeComponent()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
                // 
                // mProcess
                // 
                this.mProcess.EnableRaisingEvents = true;
                this.mProcess.StartInfo.Domain = "";
                this.mProcess.StartInfo.FileName = "notepad.exe";
                this.mProcess.StartInfo.LoadUserProfile = false;
                this.mProcess.StartInfo.Password = null;
                this.mProcess.StartInfo.StandardErrorEncoding = null;
                this.mProcess.StartInfo.StandardOutputEncoding = null;
                this.mProcess.StartInfo.UserName = "";
                this.mProcess.StartInfo.WindowStyle =         
                System.Diagnostics.ProcessWindowStyle.Maximized;
                this.mProcess.SynchronizingObject = this;
                this.mProcess.Exited += new  
                                               System.EventHandler(this.mProcess_Exited);
    La form contient un bouton qui lance l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            /// <summary>
            /// Evenement Bouton pour l'édition du fichier de configuration
            /// </summary>
            /// <param name="sender">Objet Sender</param>
            /// <param name="e">Argument d'évenement</param>
            private void BtcEdit_Click(object sender, EventArgs e)
            {
                // Ouverture de l'application externe
                mProcess.Start(); 
            }
    Mon pb est le suivant : A chaque fois que je clique sur le bouton, deux instances de notepad sont lancées.
    j'ai vérifié que je n'avais pas dans la pile un autre appel sur cette procédure...
    je ne saisie pas car je souhaite que l'appli lancée soit synchronisée avec mon application windows Form. et je me retrouve avec une instance (1ère non synchronisée et la 2ème synchronisée).

    Connaissez l'origine de ce pb {bug du composant Process ou autre}
    Merci d'avance pour votre aide.

  2. #2
    Xno
    Xno est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut
    Salut,

    J'ai fait une WinForm de test sous Windows XP SP2 avec Visual Studio 2005, donc en .NET 2.0, et en ajoutant le composant Process, avec les mêmes paramètres que toi, et ça fonctionne. Vraiment bizarre?!

    Je n'ai qu'une instance de notepad qui est lancée lorsque je clique sur le bouton qui utilise la méthode Start().

    J'ai mis en pièce jointe le projet si tu veux tester, au moins le lancer, car je ne sais pas si tu pourras l'ouvrir avec la version Express de Visual Studio.

    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    Merci pour ton aide.
    En effet celà focntionne egalement chez moi.
    Celà vient du composant bouton Wildgrape.Aqua.Controls.dll qui est un bouton spécifique style eau. et l'evenemnt click genere deux evenements click et le click droit un seul

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    J'ai un autre souci maintenant,

    Si je clique à nouveau sur le bouton de lancement et que l'application externe est déjà lancé par un premier clique, je vroudrais rendre visible l'application et non en ouvrir une seconde.


    A priori le champ handle de l'objet Process contient le handle du premier lancement !!!
    Comment faire cette manip ?

    Merci d'avance

  5. #5
    Xno
    Xno est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut
    Je ne sais pas si tu peux te baser sur la propriété Handle du composant Process, car il reste sur la dernière valeur affichée une fois que l'application qui a été lancée a été fermée. Peut-être en l'utilisant avec la propriété HasExited, ça peut passer?

    Pour réafficher un processus actif, tu peux utiliser la fonction native ShowWindow. Malheureusement, à ma connaissance, il n'y a pas d'équivalent managé même en 2.0. Heureusement, tu peux faire des appels vers des fonctions natives en .NET. Pour cela, il faut déclarer cette fonction dans ton programme de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using System.Runtime.InteropServices;
     
    [DllImport(@"user32", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "ShowWindow", CallingConvention = CallingConvention.StdCall)]
    public static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
    Un site indispensable pour ce genre de déclarations: http://www.pinvoke.net/

    Après, tu peux utiliser cette méthode comme n'importe quel autre fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // 3=maximized, 2=minimized, 1=normal
    ShowWindow( p.MainWindowHandle, 3 );
    Pour ton problème, j'ai simplement garder dans une variable, l'id du processus que j'ai lancé. Si tu gères plusieurs processus, tu peux faire un tableau d'entiers, car l'id d'un processus est de type int. Au démarrage de l'application, j'ai initialisé cette variable à 0 (ou -1).

    Voici le code lorsque j'appuie sur le bouton pour démarrer le processus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                if (this.id != 0)
                {
                    Process p = Process.GetProcessById(this.id);
                    if (p.MainWindowHandle != IntPtr.Zero)
                    {
                        // 3=maximized, 2=minimized, 1=normal
                        ShowWindow(p.MainWindowHandle, 3);
                        return;
                    }
                }
     
                if (this.process1.Start())
                {
                    this.id = this.process1.Id;
                }
                else
                    this.id = 0;
    Je vérifie si la variable id est nulle ou pas. Si elle est nulle, je démarre un nouveau processus, sinon j'essaie de retrouver le handle du processus déjà lancé à partir de son id.

    C'est une façon de faire, il doit en exister d'autres.

    J'espère que ça t'a aidé.

    Fichiers attachés Fichiers attachés

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    Génial !!!!
    çà c'est de l'aide !
    Merci encore pour ton aide, c'est éxactement ce que je voulais faire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Le Composant « Process »
    Par Mirfak dans le forum Symfony
    Réponses: 11
    Dernier message: 15/12/2013, 08h00
  2. Réponses: 2
    Dernier message: 01/09/2009, 10h17
  3. Eclipse Process Framework Composer
    Par Hotchotte dans le forum Eclipse
    Réponses: 0
    Dernier message: 10/06/2009, 15h34
  4. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo