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

MFC Discussion :

Detecter la fin d'un ecran de veille


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Detecter la fin d'un ecran de veille
    Salut,
    Quelqu'un sait-il si il est possible de detecter :
    - la mise en route de l'economiseur d'ecran de windows
    - la fin de l'economiseur d'ecran

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu veux parler du screen saver ? ou bien quand il éteint l'écran ?

    S'agit-il de ton screen saver ? dans ce cas, il s'agit de regarder du coté de ScreenSaverProc

    Quelle est la finalité ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    En fait mon application doit detecter la fin de l'economiseur d'écran pour effectuer un certain traitement.
    D'avance merci.

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    j'ai ressussi a detecter la mise en route de l'écran de veille par la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd::OnSysCommand(UINT nID, LPARAM lParam)
    nId = SC_SCREENSAVE

    Mais pas pour le fin du screen saver.

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    alors, je sais pas trop ...

    deux idées qui me viennent comme ca, mais sans garanties de fonctionnement.

    Hooker l'api ScreenSaverProc avec un WH_GETMESSAGE, et intercepter le message WM_DESTROY
    Ou du meme genre, un hook sur WH_SHELL, et intercepter HSHELL_WINDOWCREATED pour y loger une nouvelle callback de traitement du ScreenSaverProc et de meme intercepter WM_DESTROY

    dans les deux, ils s'agit d'injecter sa dll dans le process du screen saver


    Mais bon ... à défaut de savoir s'il y a plus simple ...

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Euh ... la je suis pas sur d'y arriver ...
    Mais si y a pas plus simple je vais tenter comme ca.
    Merci

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tiens, je viens de regarder un petit peu, et je pense etre arrivé à une solution

    En hookant simplement les messages qui arrivent aux procédurent de traitement de messages, dans le cas où le process se fini par .SCR (pour un screensaver).
    Il suffit ensuite d'intercepter le message WM_DESTROY

    ca donne une dll qui ressemble à ca :

    .def
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LIBRARY	hookMiseEnVeille
    EXPORTS
      installeHookProcedure    @1
      enleveHookProcedure    @2
    .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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <windows.h>
     
    HINSTANCE hMod = 0;
    HHOOK hhk = 0;
    int scrProccess = 0;
     
    void verifScrProcess()
    {
        char buff[264], *c;
        DWORD len;
        len = GetModuleFileName(0, buff, 264);
        c = buff + len - 3;
        if (_strnicmp(c,"scr",3))
            return;
    	scrProccess = 1;
    }
     
    BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
    {
        switch(dwReason)
        {
            case DLL_PROCESS_ATTACH:
                hMod = hDll;
                verifScrProcess();
                break;
    		case DLL_PROCESS_DETACH:
    			break;
    	}
        return 1;
    }
     
    LRESULT CALLBACK myCallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode == HC_ACTION) 
    	{
    		if (scrProccess)
    		{
    			CWPRETSTRUCT kbStruct = *((CWPRETSTRUCT *)lParam);
    			if (kbStruct.message == WM_DESTROY)
    			{
    				OutputDebugString("Fin de la mise en veille");
    			}
    		}
    	}
        return CallNextHookEx(hhk, nCode, wParam, lParam);
    }
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    int __stdcall installeHookProcedure()
    {
      if(!hhk) 
    	  hhk  = SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, hMod, 0);
      return (int) hhk;
    }
     
    void __stdcall enleveHookProcedure()
    {
      if(hhk)
      {
    	  UnhookWindowsHookEx(hhk); 
    	  hhk = 0;
      }
    }
     
    #ifdef __cplusplus
    }
    #endif
    restera plus qu'à appeler les fonctions exportées depuis ton executable


  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Pour etre sur de s'etre bien compris :
    - Mon application n'est pas un economiseur d'ecran.
    - Mon application doit detecter la fin de l'economiseur d'ecran de windows pour effectuer un traitement.

    Encore merci

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    on s'est bien compris

    ton application devrait donc avoir une dll, comme celle que je viens d'écrire et dont je t'ai mis le code.

    Ton application devra lancer la méthode installeHookProcedure au début

    A l'endroit où j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OutputDebugString("Fin de la mise en veille");
    , la dll devra notifier ton programme qu'elle a detecté la fin de la mise en veille (par exemple en envoyant un message à ton application)

    Et à la fin, ton application devra désinstaller le hook avec enleveHookProcedure

  10. #10
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    oki cool
    je vais me lancer la dedans lundi je te retiens au courant.

    je le dit ou je le dit pas ; allez je le dit pour la 5eme fois

    MERCI !

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bon alors en fait j'ai fait une petite bidouille qui marche bien dans mon cas. Mon application est toujours en premier plan et seule la souris peut intéragir avec elle.

    Mon application detecte la mise en marche de l'économiseur d'écran

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
       	if(nID == SC_SCREENSAVE)//61760)
    	{
    		TRACE("DEBUG -> STAT SCREEN SAVER");
    		bEconomiseur = true;
    	}
    	CDialog::OnSysCommand(nID, lParam);
     
    }
    Mon application detecte que la souris a bougé
    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
     
    BOOL Dlg::PreTranslateMessage(MSG* pMsg)
    {
    	switch(pMsg->message)
    	{
    	case WM_MOUSEMOVE : //512 :
    		if(bEconomiseur == true)
    		{
    			bEconomiseur = false;
    			TRACE("[DEBUG]On revient de l'ecran de veille");
                            // !!!! Mon traitement !!!
                            // !!!! Mon traitement !!!
    		}
    		break;
    	}
    	CWnd::PreTranslateMessage(pMsg);
    	return FALSE;
    }
    Et voila ...
    Bon c'est un peu plus simple mais ca limite son utilisation.

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    mmmhhh ....

    pourquoi pas

    pense aussi à tester si la mise en veille a été quittée autrement (par pression sur une touche par exemple)

  13. #13
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    oui j'y avais penser mais non car :
    Mon application est toujours en premier plan et seule la souris peut intéragir avec elle.

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

Discussions similaires

  1. Arret Ecran de veille
    Par Scyrius dans le forum Windows
    Réponses: 3
    Dernier message: 15/10/2005, 14h50
  2. [Débutant][ThreadGroup] Détecter la fin de toutes les tâches
    Par onlytoine dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 19/09/2005, 10h47
  3. Désactiver ecran de veille
    Par Syriac dans le forum Windows
    Réponses: 3
    Dernier message: 26/11/2004, 14h09
  4. ecran de veille
    Par Gandalf_new dans le forum MFC
    Réponses: 2
    Dernier message: 16/03/2004, 12h20
  5. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25

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