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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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

  3. #3
    Membre confirm�
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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;
      }
    }

  5. #5
    Membre confirm�
    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
    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 confirm�
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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); 
     }
    }

  8. #8
    Membre Expert
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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)

  10. #10
    Membre Expert
    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
    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 confirm�
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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 !

  13. #13
    Membre confirm�
    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
    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 exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    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.

  15. #15
    Membre confirm�
    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
    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
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    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