Capter la mise en veille de l'ordinateur [Résolu]

Signaler
-
 edwinzap -
Bonjour,
Je cherche un moyen pour que mon programme sache que l'ordinateur se met en veille.
J'ai cherché partout, mais je n'ai rien trouvé. Pourtant je pense que windows doit forcément envoyer une information aux programmes en cours d'exécution que l'ordinateur va se mettre en veille (aussi non les plantages seraient nombreux).
Voilà si quelqu'un a une réponse, je le remercierai vivement (car ça fait plusieurs jour que ce problème me trotte dans la tête)
Merci.

23 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Bonjour, Un timer, oui, mais accompagné tout simplement de la fonction GetLastInputInfo der la librairie user32 de l'Api de Windows et dont c'est très précisément la vocation.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Et la clavier également ? Je ne crois pas !
et des éventuels messages reçus après lancement d'une provédure lente ? Je ne le crois pas non plus !

En tout état de cause ===>> voilà un lien :
Tapez le texte de l'url ici.
on y trouvera le code utilisant cette fonction de l'Api, mais également un code VB.Net testant l'activité.

Le reste ne me regarde pas.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Bonsoir,

Comme il est expliqué sur msdn, quand le système se met en veille, il y a simultanément un changement du mode d'alimentation.
Donc tu peux abonner ton application dès son démarrage à ce changement :
AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf Standby

Puis gérer l'événement comme ceci :
Private Sub Standby(ByVal sender As Object, ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    If e.Mode = Microsoft.Win32.PowerModes.StatusChange Then
        'ta gestion ici
    End If
End Sub
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Essaie d'intercepter le message WM_POWERBROADCAST via subclassing
et regarde ce qui est envoyé à ton application...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Oups, pas vu que c'était du .NET

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Merci banana32, je vais essayer ton code dès que j'aurais le temps (et que j'aurais résolu un autre problème).
Je vous tiendrez au courant.
Encore merci.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Bonjou,
je suis âgé et risque fort d'être devenu gâteux. Alors Excusez-moi.
Il reste que, si j'ai bien compris, edwinzap est moins intéressé par le fait/constat que l'ordinateur s'est DEJA mis en veille, que par la détermination de ce qu'il VA se mettre en veille (et ce n'est pas pareil du tout, l)...)
A lui de nous dire, donc ...



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
En fait je souhaiterait savoir que l'ordinateur va se mettre en veille pour pouvoir enregistrer auparavant l'heure système (pour connaitre en fait la durée total de la mise en veille)
Voilà j'espère que je me suis mieux exprimé cette fois-ci
Alors voilà j'ai testé le code de banana32. Le code ne fonctionne pas pour ce que je désire faire. Mais par contre, le code suivant fonctionne très bien:
    Private Sub Standby(ByVal sender As Object, ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
        If e.Mode = Microsoft.Win32.PowerModes.Suspend Then
            'utiliser .suspend pour connaitre le début de la mise en veille
            veilledebut = Now
        End If
        If e.Mode = Microsoft.Win32.PowerModes.Resume Then
            'utiliser .resume pour connaitre la fin de la mise en veille
            veillefin = Now
        End If
    End Sub


En tout cas un très, très grand merci pour cette astuce, banana32.
Et je pense qu'elle ne servira pas qu'à moi!

De rien

Deux remarques cependant :
1 / Utilise Select Case au lieu de ton double test, ou bien ElseIf (à voir).
2 / Now est obsolète, à remplacer par DateTime.Now

Et bonne prog.
Ok, je vais modifier ça.
Mais pourquoi ne peut-on pas utiliser now tout simplement?

Now fait partie de l'espace de noms Microsoft.VisualBasic qui est importé automatiquement et par défaut dans les projets. Ceci pour assurer une compatibilité avec les programmes convertis depuis vb6.

Pour avoir un code en pur .NET, retire cet import dans les références de ton projet.

Bien entendu, tu n'es pas obligé de le faire mais disons que c'est pour prendre de bonnes habitudes.
Et si j'utilise timeofday, est-ce que c'est mieux?

System.DateTime.Now fait très bien l'affaire, je ne vois pas ce qui te dérange ?
Dans le même ordre d'idée, est-il possible de connaitre le temps d'inactivité de l'ordinateur, voulant dire par-là lorsque l'utilisateur ne bouge pas la souris. Un peu le même système qu'utilisé dans messenger, skype,... permettant de mettre l'utilisateur comme absent après un certain temps.
Merci

Oui tu peux par exemple en plaçant un timer sur ton formulaire. Analyser la position du curseur en récupérant les coordonnées x et y de cette façon :
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     Debug.Print(String.Format("x={0}  y={1}", Cursor.Position.X, Cursor.Position.Y))
End Sub

Si ces valeurs ne changent pas pendant un certain temps, tu pourras en déduire que l'utilisateur fais la sieste. Il faudra également surveiller le clavier parce qu'il y a des personnes (comme moi) qui n'utilisent quasiment pas la souris.

Non ucfoutu, Cursor.Position remplace avantageusement cet API.

J'ai encore lu en diagonale, tu as raison et merci de me pardonner
Et bonne soirée.

Le problème ici, c'est qu'on ne peut pas supprimer voire éditer ses propres messages.
Donc merci de ne pas tenir compte de mes 3 derniers messages, de tester la solution de ucfoutu et de me f..... la p...
Et bonne soirée
Bonjour, bonsoir et merci pour vos réponses.
Je vais tester ça ucfoutu. Je vous tiendrez au courant.