Interception de la fermeture de windows

Résolu
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007 - 5 déc. 2006 à 15:27
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007 - 6 déc. 2006 à 13:38
Bonjour tout le monde


Encore une question de ma part


je voudrais intercepter la fin de windows pour le mettre en suspent et lancer un programme avant de fermer windows.


J'arrive à mettre l'arrêt en suspent et fermer ensuite windows mais je n'arrive pas à mettre en écoute mon application afin qu'il détecte la fin de windows Quelqu'un pourrait me dire comment faire ou me dire où je pourrais trouver l'info ?


 


Merci par avance

 Laetitia

21 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 déc. 2006 à 16:07
Salut,
Dans la procédure WndProc de ta fenêtre, tu peux intercepter le message WM_QUERYENDSESSION. Pendant le traitement de ce message, tu lances ton programme et retourner 0. Il ne faut pas oublier de fermer aussitôt l'application qui lance le programme. C'est ce dernier qui se chargera de fermer Windows.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2006 à 19:40
Eh bien tu fais ce que tu veux quand tu recois WM_ENDSESSION et c'est tout. Pourquoi veux tu appeler AbortSystemShutdown?
Il faut jsute que l'appel de ton programme soit bloquant. C'est facile a faire avec ShellExecuteEx et WaitForSingleObject

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2006 à 16:03
Tu reçois le message WM_QUERYENDSESSION. Si tu veux annuler la fermeture de session, tu dois retourner TRUE à ce message

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 déc. 2006 à 16:11
vecchio56 >> Je pense qu'il faudra retourner FALSE pour annuler la fin de session.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 16:33
Merci pour votre aide mais ca marche pas.
J'ai fait ca :

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:


            return 0;


        case WM_QUERYENDSESSION :
            interrompre_arret();
            return 0;


        case WM_DESTROY:
            interrompre_arret();
            PostQuitMessage(0);
            return 0;


        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

Dans ma fonction interrompre_arret, j'utilise      AbortSystemShutdown(NULL); 
 avant de lancer mon programme.

Quand je ferme mon appli, il me fait bien la fonction interrompre_arret, et ca marche bien.
Mais quand je ferme windows ou quitte la session, il ne fait rien et ferme tout

Help please !!!!!!!!!!!!

 Laetitia
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2006 à 16:37
racpp> Oui je me suis trompé

Normalement tu n'a pas à utiliser AbortSystemShutdown, si tu retournes 0 ca doit être bon...

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 16:51
cad ?
Je ne comprends pas ce que je dois faire. Tu peux me donner encore un petit coup de pousse s'il te plait

 Laetitia
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 déc. 2006 à 17:03
D'après MSDN, si une application retourne 0 en réponse au message WM_QUERYENDSESSION la fermeture de Windows est annulée.
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 17:09
Oui mais justement dans mon prog, je mets bien un return 0 , comme tu peux le voir plus haut. Alors pourquoi ca ne marche pas ??????? A moins que ce n'est pas de ce return 0 que tu me parles ????

 Laetitia
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 déc. 2006 à 17:25
Assure-toi que ta fenêtre reçoit bien le message WM_QUERYENDSESSION en ajoutant un MessageBox(). Dans certains cas ce message n'est pas envoyé pour forcer toutes les applications à se fermer.
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 17:31
Exact, il ne m'affiche pas de messageBox. Mais alors comment faire pour que mon prog s'exécute avant la fermeture de Windows ????

 Laetitia
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 déc. 2006 à 17:45
Et WM_ENDSESSION?   Si tu arrives à l'intercepter, je pense que tu pourras utiliser AbortSystemShutdown().
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2006 à 18:31
Le but est-il de faire une tache avant de fermer le session, ou bien d'empêcher la fermeture de la session?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 19:37
Le but est de lancer un prog qui une fois terminé, terminera ou fera terminer la session ou windows entièrement

 Laetitia
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 20:01
Tu as tout à fait raison. c'est plus logique.
Par contre, le problème est qu'apparemment mon programme ne recoit pas WM_ENDSESSION ! A moins que je ne  l'utilise pas correctement .
Je peux l'utiliser comme cela ?
case WM_QUERYENDSESSION :
            interrompre_arret();
            return 0;

dans lequel ma fonction  interrompre_arret(); lance le programme

Y a-t-il une raison à mon problème ?

 Laetitia
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 20:01
oups dans le message précédent, remplacer WM_QUERYENDSESSION  par WM_ENDSESSION

 Laetitia
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2006 à 20:02
Pardon, c'est bien de WM_QUERYENDSESSION que je voulais parler, et non WM_ENDSESSION.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 déc. 2006 à 20:42
Oui mais je reviens donc à mon problème que mon prog ne recoit pas WM_QUERYENDSESSION
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:


            return 0;


        case WM_QUERYENDSESSION :
            MessageBox(0, "1006", "SOS", 0);
            //AbortSystemShutdown(NULL);
            interrompre_arret();
            return 0;
           


        case WM_DESTROY:
            interrompre_arret();
            PostQuitMessage(0);
            return 0;
           


        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

Il n'y a pas de MessageBox et l'arret n'est pas interrompu. Je suis sur que ma fonction  interrompre_arret(); fonctionne car avec WM_DESTROY pas de problème.

Quelqu'un pourrait me dire comment je peux faire autrement ?

Merci

 Laetitia
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 déc. 2006 à 00:33
Normalement, ton application devrait recevoir WM_QUERYENDSESSION. Il est probable que le mode Debug empêche la réception de ce message. Tu as essayé en mode Release?
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
6 déc. 2006 à 13:38
Bonjour
et merci pour votre aide pour tous ceux qui m'ont répondu
Juste pour vous dire que c'est bon avec WM_QUERYENDSESSION. En fait, je ne faisais pas de projet sous DevC++ etj'exécutais directement le main. Dans ce cas là, ca ne marche pas.

Voilà, avec un porjet c'est impeccable. Encore merci pour votre aide

 Laetitia
0
Rejoignez-nous