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++Builder Discussion :

Fermeture de session WndProc()


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut Fermeture de session WndProc()
    Bonjour,

    Je développe toujours mon programme socket et à la fermeture de windows ou de la session, donc il la détecte mais bloque, j'essaie de fermer mon application en envoyant un message que le serveur va se fermer :
    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
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
     if (Message.Msg == WM_QUERYENDSESSION &&
         SrvSocket->Active == true &&
         SrvSocket->Socket->ActiveConnections >= 1)
     {
      //Fermeture de la session !
      for (int i=0; i<SrvSocket->Socket->ActiveConnections; i++)
      {
       if(SrvSocket->Socket->Connections[i]->Connected)
       {
        // envoie à tous
        SrvSocket->Socket->Connections[i]->SendText("/endsession");
       }
      }
      //Ferme la connexion sans forcer
      SrvSocket->Active = false;
      TForm::WndProc(Message);
      Application->Terminate();
     }
     else
     {
     //Laisse passer le message
     TForm::WndProc(Message);
     }
    }
    Le problème qui se passe c'est que mon application ne se ferme pas et tant qu'elle est ouverte elle bloque la fermeture de windows !!!

    Merci d'avance de me corriger.

  2. #2
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Moi à ta place je n'utiliserais pas l'Application->Terminate parce que, par défaut, Windows ve fermer ton application à moins que tu ne sépcifies le contraire.

    Donc pour moi ton code doit ressembler à ceci (non testé):
    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
     
    void __fastcall TForm1::WndProc(Messages::TMessage &Message) 
    { 
     if (Message.Msg == WM_QUERYENDSESSION)     
     { 
      if(SrvSocket->Active == true && 
         SrvSocket->Socket->ActiveConnections >= 1) 
      {
        //Fermeture de la session ! 
        for (int i=0; i<SrvSocket->Socket->ActiveConnections; i++) 
        { 
         if(SrvSocket->Socket->Connections[i]->Connected) 
         { 
          // envoie à tous 
          SrvSocket->Socket->Connections[i]->SendText("/endsession"); 
         }  
        } 
      }
     
      //Ferme la connexion sans forcer 
      SrvSocket->Active = false; 
     } 
     else 
     { } 
     
      TForm::WndProc(Message); 
    }
    Dis nous ce que ça donne...

    Bon courage
    "Don't think you are, know you are..." (Morpheus)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Merci, je vais essayer et je te dis ça, dès que je peux.

    Edit: Le programme bloque toujours la fermeture de session c'est bizarre... Mais dès que je ferme mon application et que je réssaie de fermer la session elle se ferme ... c'est trop bizarre !
    C'est peut être lier au fait que dans l'évènement OnClose de ma TForm il y aie Action = caNone ?

  4. #4
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par jamesb
    Merci, je vais essayer et je te dis ça, dès que je peux.

    Edit: Le programme bloque toujours la fermeture de session c'est bizarre... Mais dès que je ferme mon application et que je réssaie de fermer la session elle se ferme ... c'est trop bizarre !
    C'est peut être lier au fait que dans l'évènement OnClose de ma TForm il y aie Action = caNone ?
    Ah bah bien sûr dans ce cas là ton application ne se fermera pas, ni Windows d'ailleurs !!

    Ce qu'il faut faire c'est définir un booléen global. Lorsque ce booléen est false tu empêches la fermeture de ton application. S'il est à true tu peux la fermer. Et bien évidemment tu viens placer ce booléen à true lorsque tu reçois le message QUERYENDSESSION.

    .h
    .cpp
    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
     
    //Sur le FormClose
    If(JePeuxFermer == true)
      Action = caFree;
    else
      Action = caNone;
     
    //Dans WndProc
    void __fastcall TForm1::WndProc(Messages::TMessage &Message) 
    { 
      if (Message.Msg == WM_QUERYENDSESSION)
      {
         JePeuxFermer = true;
      }
    }
    "Don't think you are, know you are..." (Morpheus)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    ça rejoint mon autre post mais ça bloque toujours. Voici mon code en ce moment:

    FormClose()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
     if (DemandeFermeture == false)
       Action = caNone;
      else
       Action = caFree;
    }
    //---------------------------------------------------------------------------
    WndProc()
    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
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
     if (Message.Msg == WM_QUERYENDSESSION)     
     {
      if(SrvSocket->Active == true &&
         SrvSocket->Socket->ActiveConnections >= 1)
      {
        //Fermeture de la session !
        for (int i=0; i<SrvSocket->Socket->ActiveConnections; i++)
        {
         if(SrvSocket->Socket->Connections[i]->Connected)
         {
          // envoie à tous
          SrvSocket->Socket->Connections[i]->SendText("/endsession");
         }
        }
      }
     
      //Ferme la connexion sans forcer
      SrvSocket->Active = false;
      //Demande de fermeture ON
      DemandeFermeture = true;
     }
     else
     { }
     
      TForm::WndProc(Message);
    }
    //---------------------------------------------------------------------------
    Je sais pas quoi faire pour que ça marche

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    J'essaie, pour comprendre le fonctionnement, de créer un programme pour bloquer la fermeture de session mais j'y arrive pas. Je ne sais pas comment m'y prendre, voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall WndProc(Messages::TMessage &Message)
    {
     if (Message.Msg == WM_QUERYENDSESSION &&
         Form1->SystemActive == true) //Fermeture de session?
     {
      //Alors Bloquer !
      Form2->Show();
      Message.Msg = 0; // J'ai essayé sans mais aucune différence !
     }
     else
     { } //Sinon envoie le message
     
    }
    J'ai un peux repris ton code Neo41 mais sans succès. Donc j'ai dit que de developpait un programme pour bloquer la fermeture de session. Mon système peut être désactivé ou activé. Donc la variable a testé pour savoir ça c'est SystemActive (moi qui l'est créé).

    En ce moment mon code ne bloque rien du tout meme si ma variable est true.

    Merci de m'aider svp.

  7. #7
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Je pense avoir trouvé, essayes comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall WndProc(Messages::TMessage &Message) 
    { 
     if (Message.Msg == WM_QUERYENDSESSION)
     { 
       //Traitement...
        return;
     } 
     else 
     { 
        TForm::WndProc(Message); 
     }
    }
    "Don't think you are, know you are..." (Morpheus)

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    windows attend une réponse au message WM_QUERYENDSESSION
    si tu réponds a ce message par 0 windows stoppera soit le LogOff, soit le shutdown
    il faut procéder de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
     if(Message.Msg==WM_QUERYENDSESSION)
     {
      ..... Ton traitement 
        Message.Result=1; // indiqation à l'OS de la suite du processuis de logoff
        Close();// on termine l'application
      }
      else
        TForm::WndProc(Message);// traitement normal des messages
    }
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par DjmSoftware
    bonsoir,
    windows attend une réponse au message WM_QUERYENDSESSION
    si tu réponds a ce message par 0 windows stoppera soit le LogOff, soit le shutdown
    il faut procéder de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
     if(Message.Msg==WM_QUERYENDSESSION)
     {
      ..... Ton traitement 
        Message.Result=1; // indiqation à l'OS de la suite du processuis de logoff
        Close();// on termine l'application
      }
      else
        TForm::WndProc(Message);// traitement normal des messages
    }
    cordialement
    Je ne vois pas l'intéret de Message.Result=1; et Close(); puisque windows va de toute façon fermer l'application et qu'il en verra le message WM_CLOSE : (cf. mon code)
    "Don't think you are, know you are..." (Morpheus)

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    mon code ne fait que suivre les spécification des API win32 de Microsoft
    a savoir
    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
     
    The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function. If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero. 
     
    After processing this message, Windows sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message. 
     
    WM_QUERYENDSESSION  
    nSource = (UINT) wParam;    // source of end-session request 
    fLogOff = lParam            // logoff flag 
     
     
    Parameters
     
    nSource
     
    Reserved for future use. 
     
    fLogOff
     
    Value of lParam. Indicates whether the user is logging off or shutting down the system. Supported values include: ENDSESSION_LOGOFF.
    Return Values
     
    If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE
    il est cependant clair que l'appel proposé a la méthode close() est dans ce cas précis inutile

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Je sais pas si vous avez bien compris? Je me suis peut-être mal exprimés:

    Dans mon 1er projet: j'ai fais un programme qui fait quelque chose avant de se fermer avec la session, mais elle bloque la fermeture de session.

    A un moment j'ai tenté d'enlevé la fonction WndProc() mais ça bloquait toujours et quand j'enlève la fonction Close encore. D'où cela pourrait venir?

    Mon 2ème projet consiste à bloquer la fermeture de session.
    J'ai essayer Message.msg = 0; mais ça ne marche pas.

    Citation Envoyé par Neo41
    Je pense avoir trouvé, essayes comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall WndProc(Messages::TMessage &Message) 
    { 
     if (Message.Msg == WM_QUERYENDSESSION)
     { 
       //Traitement...
        return;
     } 
     else 
     { 
        TForm::WndProc(Message); 
     }
    }
    Ton code marche bien, mais tous les autres programmes se ferment, y'a-t-il une solution pour emêcher la fermeture des autres programmes?

    DjmSoftware : J'essaie de bloquer la fermeture dans mon 2ème projet. Mais pas dans le premier.

  12. #12
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par jamesb
    Je sais pas si vous avez bien compris? Je me suis peut-être mal exprimés:

    Dans mon 1er projet: j'ai fais un programme qui fait quelque chose avant de se fermer avec la session, mais elle bloque la fermeture de session.

    A un moment j'ai tenté d'enlevé la fonction WndProc() mais ça bloquait toujours et quand j'enlève la fonction Close encore. D'où cela pourrait venir?
    Est ce que t'as bien enlevé Action=caNone de l'événement OnCloseQuery ?

    Citation Envoyé par jamesb
    Citation Envoyé par Neo41
    Je pense avoir trouvé, essayes comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall WndProc(Messages::TMessage &Message) 
    { 
     if (Message.Msg == WM_QUERYENDSESSION)
     { 
       //Traitement...
        return;
     } 
     else 
     { 
        TForm::WndProc(Message); 
     }
    }
    Ton code marche bien, mais tous les autres programmes se ferment, y'a-t-il une solution pour emêcher la fermeture des autres programmes?
    Le code que je t'ai donné sert à empêcher l'application de se fermer, et donc windows ne pourrait pas terminer la session non plus.

    Mais apparemment (et c'est nouveau ça) tu veux empêcher également que les autres applications se ferment ? Là je n'ai aucune idée. Je ne sais pas si tu peux intercepter une sorte de message envoyé par windows (avant WM_QUERYENDSESSION) et qui indique qu'il va bientôt procéder à la fermeture de la session...

    Avis aux connaisseurs !
    "Don't think you are, know you are..." (Morpheus)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Projet1:
    Est ce que t'as bien enlevé Action=caNone de l'événement OnCloseQuery ?
    J'utilise Close() de ma TForm1 et je l'ai carément mis en commentaire.
    Si l'erreur n'est pas dedans, ce que je craint fortement, c'est que y'a un bug dans mon socket ?

    Un détail peut-être important ?
    J'ai remarqué quand je ferme la session l'icône TTray disparaît mais le programme tourne toujours (en arrière plan) ! Même sans WndProc ni fonction Close().

    Projet2:
    Mais apparemment (et c'est nouveau ça) tu veux empêcher également que les autres applications se ferment ? Là je n'ai aucune idée. Je ne sais pas si tu peux intercepter une sorte de message envoyé par windows (avant WM_QUERYENDSESSION) et qui indique qu'il va bientôt procéder à la fermeture de la session...
    Bas la solution serait de prendre le message et lui renvoyé un message pour annulé à Windows, car c'est Windows qui ferme les autres programmes. Donc si on peut pas mon projet 2 est résolu.

  14. #14
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Bon eh bien si ton projet ne fait pas 10000 lignes et si tu veux bien, envoies le moi par MP et je verrais si je peux faire quelque chose ce soir (après m'être défoulé au jujitsu je me défoulerai sur ton code )

    Et bien évidemment si une solution il y a elle sera postée içi.
    "Don't think you are, know you are..." (Morpheus)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Neo41 m'a bien aidé, il a trouvé l'erreur. Attention le composant NMFTP de l'onglet FastNet bloque la fermeture de session !

    Mon problème est résolu, merci encore à Neo41 !

  16. #16
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    T'as raison, en son temps, j'ai eu le même pb avec NMFTP.
    En plus NMFTP en plutôt buggé, j'ai donc changer pour les composant ICS qui sont gratuits et beaucoup plus fiables.

    pour info : http://www.overbyte.be

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

Discussions similaires

  1. [Hibernate][Struts] Fermeture des session hibernate
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/08/2005, 17h30
  2. [Session]Problème de fermeture de session
    Par july dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 16/06/2005, 12h25
  3. Interception de la fermeture de session
    Par xoris dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/12/2004, 19h50
  4. [JSP] session et fermeture de session
    Par monoeilouais dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 14/04/2004, 16h02
  5. Probleme de redirection apres fermeture de session
    Par soufienne dans le forum ASP
    Réponses: 3
    Dernier message: 08/04/2004, 10h52

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