Capter la mise en veille de l'ordinateur

Résolu
edwinzap - 20 janv. 2013 à 12:41
 edwinzap - 17 mars 2013 à 16:12
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
27 janv. 2013 à 18:14
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.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
27 janv. 2013 à 18:23
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.
3
Utilisateur anonyme
20 janv. 2013 à 16:53
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
2
cs_ghuysmans99 Messages postés 3983 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
20 janv. 2013 à 16:21
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
0

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

Posez votre question
cs_ghuysmans99 Messages postés 3983 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
20 janv. 2013 à 17:20
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
0
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
21 janv. 2013 à 21:40
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.
0
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
0
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!
0
Utilisateur anonyme
23 janv. 2013 à 19:14
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.
0
Ok, je vais modifier ça.
Mais pourquoi ne peut-on pas utiliser now tout simplement?
0
Utilisateur anonyme
24 janv. 2013 à 17:40
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.
0
Et si j'utilise timeofday, est-ce que c'est mieux?
0
Utilisateur anonyme
24 janv. 2013 à 17:50
System.DateTime.Now fait très bien l'affaire, je ne vois pas ce qui te dérange ?
0
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
0
Utilisateur anonyme
27 janv. 2013 à 18:05
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.
0
Utilisateur anonyme
27 janv. 2013 à 18:18
Non ucfoutu, Cursor.Position remplace avantageusement cet API.
0
Utilisateur anonyme
27 janv. 2013 à 18:19
J'ai encore lu en diagonale, tu as raison et merci de me pardonner
Et bonne soirée.
0
Utilisateur anonyme
27 janv. 2013 à 18:33
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
0
Bonjour, bonsoir et merci pour vos réponses.
Je vais tester ça ucfoutu. Je vous tiendrez au courant.
0
Rejoignez-nous