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

Framework .NET Discussion :

Par où passe une application qui quitte ?


Sujet :

Framework .NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 17
    Points
    17
    Par défaut Par où passe une application qui quitte ?
    Bonjour

    Je viens de réaliser une petite application WindowsForm en C#/.Net 4.0 qui se place dans le SysTray.
    J'ai besoin d'exécuter une commande quand mon application se ferme.
    Pas de problème lorsque l'utilisateur utilise un menu contextuel de l'icone de notification ou bien via la croix rouge en haut à droite de la Form associée.

    Par contre, si l'utilisateur ferme sa session, impossible de trouver par où passe le code ou quel handler il faut prendre. Résultat mon code de fermeture ne s'exécute pas.

    Même dans le Program.Main ca ne marche pas :
    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
     
            [STAThread]
            static void Main()
            {
                shouldExecuteWhenExiting = true;
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmMain());
     
                if (shouldExecuteWhenExiting)
                {
                    Execute();
                    shouldExecuteWhenExiting = false;
                }
            }

    Est-il possible d'intercepter la fermeture de l'application dans ce cas là ?

    Merci d'avance

    Jean-Michel.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par barbudor Voir le message
    Est-il possible d'intercepter la fermeture de l'application dans ce cas là ?
    Oui c'est possible en gérant l'évènement Application.ApplicationExit

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Merci.
    Ca semble simple par le nom.
    J'aurais du trouver tout seul.

    (Ps: les notifs de réponses ne semblent pas marcher pour moi)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par barbudor Voir le message
    (Ps: les notifs de réponses ne semblent pas marcher pour moi)
    ça veut dire quoi ?

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Aulieu de poser une question il aurait du écouter son esprit puisque le nom de l'event est très évocateur.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Aulieu de poser une question il aurait du écouter son esprit puisque le nom de l'event est très évocateur.
    Ah oui! je vois Le français est parfois difficile ! j'avais pas du tout compris !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    ça veut dire quoi ?
    Ça veut dire que sur ce forum je ne reçoit pas d’émail de notification de réponse ... mais j'ai trouvé pourquoi - corrigé maintenant.


    Sinon, la réponse ci-dessus ne marche pas.
    Comme tous mes précédents essais, cela marche quand on quitte normalement l'application mais le handler ApplicationExit n'est toujours pas appelé si l'utilisateur ferme sa session ou Windows.

    Dans ce cas, le programme se ferme mais je ne sais pas par où...


    Merci d'avance

    A+

    Jean-Michel "barbudor"

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour, deux solutions dans ce cas :
    * Avec Windows Forms : Form.Closing
    * Sinon : Microsoft.Win32.SystemEvents.SessionsEnding

    Il est même possible d'interrompre le shutdown de Windows via les arguments de Form.Closing.

    Sinon... Ton code original ne marchait pas ? Peut-être parce que le thread était terminé par une exception (ThreadAbortException), un finally résoudrait le problème.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Bonjour DonQuichotte

    Nada, rien de rien :

    - FormClosing : je n'y passe pas comme indiqué plus haut
    - Je ne reçois pas plus l'event en question

    Voici un extrait de mon code (avec du debug a l'ancienne à coup de fichier log car pas possible de tracer dans le code quand l'utilisateur ferme sa session)

    Quand l'appli tourne et que l'utilisateur ferme sa session, le fichier log est vide.





    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
     
    ...
    namespace ExecOnQuit
    {
        public partial class frmMain : Form
        {
    ....
            private static int WM_QUERYENDSESSION = 0x11;
            protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                // Code pompé sur la page de MSDN : http://msdn.microsoft.com/fr-fr/library/microsoft.win32.systemevents.sessionending.aspx
                if (m.Msg == WM_QUERYENDSESSION)
                {
                    StreamWriter sw = new StreamWriter(Program.LogFileName, true);
                    sw.WriteLine("{0} : WndProc(QueryEndSession)", DateTime.Now.ToString() );
                    sw.Close();
                }
     
                // If this is WM_QUERYENDSESSION, the closing event should be
                // raised in the base WndProc.
                base.WndProc(ref m);
     
            } //WndProc 
     
            private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
            {
                StreamWriter sw = new StreamWriter(Program.LogFileName, true);
                sw.WriteLine("{0} : FormClosing(s='{1}',e=[{2},{3}])", DateTime.Now.ToString(), sender.ToString(), e.Cancel, e.CloseReason);
                sw.Close();
            }
     
    ....
        }
    }

    EDIT : Je relève dans MSDN sur l'évenement en question :
    Cet événement est déclenché uniquement si la pompe de messages est en cours d'exécution. Dans un service Windows, à moins qu'un formulaire caché ne soit utilisé ou que la pompe de messages n'ait été démarrée manuellement, cet événement ne sera pas déclenché. Pour obtenir un exemple de code qui montre comment gérer les événements système à l'aide d'un formulaire caché dans un service Windows, consultez la classe SystemEvents.
    Donc tant le FormClosing() que le QueryEndSession ne peuvent fonctionner alors que ma form est cachée ?
    (Il s'agit d'une appli dans le SystemTray comme indiqué plus haut - donc la Form est par défaut chachée)

    Toutefois, je viens de refaire un essai en fermant la session avec la Form visible (la Form peut devenir visible en double-cliquant sur l'icone dans le SysTray).

    Mais de même, toujours rien ne se passe : aucun log qui trace les évenements cités ci-dessus !

    Je désespère...

    Merci de votre aide

    Jean-Michel

  10. #10
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Non, tu as mal saisi : le message s'applique uniquement aux services windows : par défaut, ceux-ci n'ont pas de pompes à messages, à moins qu'ils en aient explicitement créé une ou qu'ils aient créé une fenêtre. Pour ton application Windows Forms, la pompe est toujours en service quoi qu'il arrive.

    Pour revenir au problème... Bigre ! Cela pourrait venir de ce que tu aurais créé une seconde pompe à messages et que c'est elle qui reçoit le message. Ça arrive dans certains cas tordus, tels que des formulaires initialisés depuis des AppDomain enfants, une console mal désallouée, etc.

    Désolé, si ce n'est pas ça, je ne vois vraiment pas ce que ça peut être. Un test sous différentes versions de Windows pourrait nous en apprendre plus à défaut.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Bonsoir DonQuichote

    Bon apparemment j'avais m...é quelque part.

    Maintenant çà passe bien dans le FormClosing dans tous les cas sans besoin de traiter l'event SessionClosing.


    Par contre mon traitement j'essaye de faire un ProcessStart() qui échoue.
    Probablement parce que je ne dois pas pouvoir lancer un nouveau process quand la station se ferme.

    La seule solution semble d'être :
    - refuser l'arrêt de la station (e.Cancel = true)
    - Lancer mon process
    - Attendre la fin du process
    - Relancer la fermeture de session

    Un peu lourd mais je ne vois pas d'autre solution.
    Reste quand même : A priori je ne peut pas refuser l'arrêt de la station et lancer mon process depuis le même handler puisque tant que je ne suit pas sortit du handler FormClosing, Windows ne sais pas encore que je refuse la fermeture ....

    Merci

    Jean-Michel

Discussions similaires

  1. Création d'une application qui s'ouvre par défaut
    Par vlksoft dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 04/03/2010, 11h42
  2. Réponses: 5
    Dernier message: 02/10/2006, 18h18
  3. Comment lancer une application qui a été développée sous Unix avec le navigateur IE
    Par diamonds dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/09/2006, 15h43
  4. Réponses: 2
    Dernier message: 08/06/2006, 15h38
  5. [VB.NET] Programmer une Application qui tourne sur un PDA?
    Par Bils dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/01/2006, 05h23

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