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

C# Discussion :

Fermeture de PowerPoint non instancié dans le code


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut Fermeture de PowerPoint non instancié dans le code
    Bonjour,

    je suis en stage dans une très grande entreprise et je dois créer un winForm sur lequel je choisi la diapositive PowerPoint à lancer via des boutons (un panneau de contrôle en quelques sorte).
    Mes PowerPoints s'instancient bien, ils s'ouvrent bien et se lancent automatiquement aussi. J'ai créé un bouton "Quitter", pour fermer l'application, et ajouté un message de confirmation pour demander si l'utilisateur veut fermer tous les powerpoints ouverts en même temps que l'appli -> dans le cas du "OUI", ça marche.

    Voici le code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #region Bouton 'Quitter'
            private void btn_quit_Click(object sender, EventArgs e)
            {
                this.Close();
            }
     
            //Demande à l'utilisateur confirmation pour quitter,
            //renvoie 'true' si confirmé
            private bool AskConfirmQuitAppli()
            {
                //message confirmation quitter appli
                if (MessageBox.Show("Voulez-vous fermer les diapositives en même temps que l'application ?", "Fermer ?", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    // non
                    return false;
                }
                else
                {
                    // oui, quitter
                    return true;
                }
            }
     
            // event déclenchée par Close()
            // déclenche ensuite event Closed sauf si annulé
            private void GestionAffichage_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (powerPoint != null)
                {
     
                    if (AskConfirmQuitAppli() == true)
                    {
                        FermerDiapo();
                        LiberationRessources();
     
                    }
                }
            }
            #endregion
            #region Méthodes
            private void FermerDiapo()
            {
                if (powerPoint != null)
                {
                    powerPoint.Quit();
                    powerPoint = null;
                }
            }
     
            private void LiberationRessources()
            {
                // Double appel à Collect et WaitForPendingFinalizers.
                // La référence mémoire vers Excel/PowerPoint peut-être conservée après le 1er appel, (raison de l'erreur provoquée si on fait un double appel)
                // on demande donc un deuxième passage du Garbage Collector
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
     
            }
    Cependant, j'ai voulu ajouter un bouton "Fermer toutes les diapositives ouvertes" qui permettrai ce que décrit le nom de ce bouton.
    Mais ça ne marche pas ! Pourtant j'ai mis la fonction "fermerDiapo();" Mais ça ne marche pas. Et encore moins si le powerPoint ouvert l'a été autrement que via l'application C#.
    J'ai essayé bcp de codes différents, selon les infos trouvées sur le net.
    Je précise que je code sur mon PC sous windows 7 pro 32 bits avec PowerPoint 2007 mais que le logiciel est destiné à un PC sous Windows XP pro 32 bits avec PowerPoint 2003.
    D'ailleurs, j'ai voulu faire afficher le fameux message "Voulez vous fermer les diapo ouvertes en même temps que l'application ?" seulement si une diapositive était ouverte. Ca fonctionne mais seulement si la diapo a été ouverte via l'appli C#, et évidemment, même en l'ouvrant avec C# puis en fermant manuellement le PowerPoint, l'appli C# la croit toujours ouverte. Et si je fais un GC.Collect() et GC.WaitForPendingFinalizers(), je finirais par obtenir un message d'erreur incompréhensible sur l'instanciation du PowerPoint ..

    J'espère que c'est pas trop brouillon c'est pas évident à expliquer, si nécessaire je recommencerais tout depuis le début en essayant d'être clair.
    Ca fait très longtemps que je parcours vos forums en trouvant toujours mes réponses, mais là, j'y arrive pas je suis désolé donc j'ai du m'inscrire et poser mes questions.

    D'avance merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut
    Finalement pour la méthode FermerDiapo() j'ai choisi ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Process[] liste = Process.GetProcessesByName("POWERPNT");
     
    private void FermerDiapo()
    {
        if (Process.GetProcessesByName("POWERPNT").Lenght > 0)
        {
            foreach (Process p in liste)
            {
                p.CloseMainWindow();
                // C'est histoire de faire plus propre, mais c'est le même résultat qu'avec p.Kill();
            }
        }
    }
    Mais ça ne marche pas. Enfin .. une fois sur dix. Pourtant, je fais appel à cette méthode à la fermeture de l'application, et là ça marche (mais de temps en temps non ..) et pour un simple bouton qui fais uniquement appel à cette méthode sans fermer le programme C#, ça ne marche pas. (ou une fois sur dix comme je viens de dire)

    Un autre souci aussi est que même quand les powerpoints ont été fermés grâce à la méthode FermerDiapo() appelée à la fermeture du programme, ben le processus POWERPNT.EXE est toujours en éxécution, même sans PowerPoint ouvert. Donc ça fausse ma liste de processus de PowerPoint ouvert quand je rééxécute le programme..

    EDIT : Dans le code, quand je dis que c'est le même résultat, c'est que le taux de réussite ne change pas que ce soit en tuant le processus ou en donannt un ordre de fermeture à la fenetre principale de PowerPoint

    D'avance merci

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 5
    Par défaut
    Bon j'ai trouvé la solution, en fait ma liste n'était pas mise à jour car la ligne d'instruction de création de ma liste était mal placée.

    Voici ma solution si ça peut aider dans le futur :
    J'ai mis la création de la liste dans la méthode FermerDiapo(). Ainsi à chaque fois que la méthode est appelée, la liste se remet à jour.
    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
    19
    20
    21
     
    private void FermerDiapo()
    {
        //Création d'une liste contenant les processus de PowerPoint en cours d'éxécution
        Process[] liste = Process.GetProcessesByName("POWERPNT");
     
        try 
        {
            foreach (Process p in liste)
                {
                     p.Refresh();
                     Thread.Sleep(1300); // on attend 1,3 seconde (j'ai vu ça sur un exemple de microsoft correspondant à la fermeture d'un programme donc je fais pareil :p)
                     p.CloseMainWindow();
                     p.Close();
               }
        }
        catch (Exception e)
        {
            MessageBox.Show("Une erreur est survenue : \n" + e.Message);
        }
    }

  4. #4
    Membre éprouvé Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Par défaut
    Bien joué et merci de mettre la solution

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/08/2010, 09h04
  2. Propriété modifiée non reportée dans le code
    Par Toutatis dans le forum Visual Studio
    Réponses: 0
    Dernier message: 11/09/2008, 10h07
  3. objets non utilisables dans le code
    Par thierry007 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 10/10/2007, 15h34
  4. Réponses: 3
    Dernier message: 27/06/2007, 11h18
  5. [ACCESS 2003] arrêt non désiré dans le code
    Par Golzinne dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/02/2006, 23h24

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