Interception de la fermeture de windows [Résolu]

Signaler
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007
-
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
vecchio56 >> Je pense qu'il faudra retourner FALSE pour annuler la fin de session.
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
D'après MSDN, si une application retourne 0 en réponse au message WM_QUERYENDSESSION la fermeture de Windows est annulée.
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Et WM_ENDSESSION?   Si tu arrives à l'intercepter, je pense que tu pourras utiliser AbortSystemShutdown().
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

Le but est de lancer un prog qui une fois terminé, terminera ou fera terminer la session ou windows entièrement

 Laetitia
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

oups dans le message précédent, remplacer WM_QUERYENDSESSION  par WM_ENDSESSION

 Laetitia
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pardon, c'est bien de WM_QUERYENDSESSION que je voulais parler, et non WM_ENDSESSION.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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?
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

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