compteur temps passé sur ordinateur allumé
compteur temps passé sur ordinateur allumé
bonjour à tous,
Ma fille passe beaucoup de temps sur son ordinateur (elle ne fait quasiment que ça de ses vacances en fait)
J'aurais voulu connaître son temps passé devant l'écran chaque jour et sur la semaine, pour lui faire prendre conscience des choses...
J'ai vu beaucoup de logiciels payants sur le net, mais l'objectif n'est pas de pister sur quels sites elle va ou ce qu'elle y fait, mais simplement de savoir combien de temps son pc est resté allumé
Je suis débutant avec PB. Je ne sais pas par où commencer...
Mon idée:
-mettre le programme dans menu démarrer (ok)
-mettre en variable l'heure actuelle (ok)
-enregistrer l'information récoltée dans un fichier txt (ok)
après le pb c'est comment dire à mon programme qu'on est en train de fermer Windows, pour qu'il enregistre l'heure de fermeture et se ferme lui-même afin de ne pas la fermeture de windows
Ma fille passe beaucoup de temps sur son ordinateur (elle ne fait quasiment que ça de ses vacances en fait)
J'aurais voulu connaître son temps passé devant l'écran chaque jour et sur la semaine, pour lui faire prendre conscience des choses...
J'ai vu beaucoup de logiciels payants sur le net, mais l'objectif n'est pas de pister sur quels sites elle va ou ce qu'elle y fait, mais simplement de savoir combien de temps son pc est resté allumé
Je suis débutant avec PB. Je ne sais pas par où commencer...
Mon idée:
-mettre le programme dans menu démarrer (ok)
-mettre en variable l'heure actuelle (ok)
-enregistrer l'information récoltée dans un fichier txt (ok)
après le pb c'est comment dire à mon programme qu'on est en train de fermer Windows, pour qu'il enregistre l'heure de fermeture et se ferme lui-même afin de ne pas la fermeture de windows
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: compteur temps passé sur ordinateur alumé
Ce sujet devrait t'interesser http://www.purebasic.fr/french/viewtopi ... 93#p180393
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: compteur temps passé sur ordinateur alumé
Merci pour ton aide falsam
Voici où je suis arrivé pour le moment
j'ai voulu adapter le code sans procédure car je n'arrivais pas à l'inclure
mais là ça ne fonctionne plus. je crois que j'ai encore râté un truc, ça doit venir du select uMsg
Voici où je suis arrivé pour le moment
j'ai voulu adapter le code sans procédure car je n'arrivais pas à l'inclure
mais là ça ne fonctionne plus. je crois que j'ai encore râté un truc, ça doit venir du select uMsg
Code : Tout sélectionner
;########## initialiser les variables... #########
nb_de_lignes_jdb = 0
position_lecture = 0
Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())
cible_fichier$ = "D:\Utilisateurs\PHPD746\Desktop\stop\test.txt"
;########## compter nb lignes du jdb #########
If ReadFile(0, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
lecture$ = ReadString(0)
nb_de_lignes_jdb = nb_de_lignes_jdb +1
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
nb_de_lignes_jdb = 0
EndIf
;########## mettre en mémoire les infos du jdb #########
Dim ligne_information.s(nb_de_lignes_jdb)
If ReadFile(0, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
ligne_information(position_lecture) = ReadString(0)
position_lecture= position_lecture +1
; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
; MessageRequester("","le fichier ne peut être lu===")
EndIf
;########## va enregistrer le journal de bord avec les infos complémentaires /// OUVERTURE
CreateFile(0, cible_fichier$)
For affichage = 0 To nb_de_lignes_jdb-1
WriteStringN(0, ligne_information(affichage))
Next affichage
WriteStringN(0, "O "+Date$+" "+Time$)
CloseFile(0)
;########## va enregistrer le journal de bord avec les infos complémentaires /// FERMETURE
If OpenWindow(0, 0, 0, 400, 400, "#WM_ENDSESSION", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_ENDSESSION, #WM_CLOSE
;====
CreateFile(0, cible_fichier$)
For affichage = 0 To nb_de_lignes_jdb-1
WriteStringN(0, ligne_information(affichage))
Next affichage
WriteStringN(0, "F "+Date$+" "+Time$)
CloseFile(0)
;====
EndSelect
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: compteur temps passé sur ordinateur alumé
La procédure WindowCallBack n'est pas une procédure comme les autres, c'est une procédure système, bas niveau
C'est un héritage de la gestion évènementielle du C, en fait une porte ouverte sur l'ensemble des actions qu’exécute windows
Avant de faire quoi que ce soit, il passe par là
Tu ne peux sortir le code qui est dedans
Pour certaines utilisations (rapidité, intervention au coeur de windows), il est difficile, voir même impossible de s'en passer
C'est un héritage de la gestion évènementielle du C, en fait une porte ouverte sur l'ensemble des actions qu’exécute windows
Avant de faire quoi que ce soit, il passe par là
Tu ne peux sortir le code qui est dedans

Pour certaines utilisations (rapidité, intervention au coeur de windows), il est difficile, voir même impossible de s'en passer

Re: compteur temps passé sur ordinateur alumé
bon j'ai avancé un peu...
le problème c'est entre ligne 194 et 205
j'effectue le calcul entre l'heure de mise en route et maintenant et au fur et a mesure que le temps passe j'ai toujours zero...
=====================
contenu du fichier preference.txt ::
=====================
en fait je voudrait lui dire:
** s'il est l'heure de debut de programme + le temps d'attente autorisé - préavis =>> action1 (annoncer qu'il ne reste plus que x minutes...)
** s'il est l'heure de debut de programme + le temps d'attente autorisé =>> action2 (eteindre le pc automatiquement)
la ca devient compliquer pour mon petit cerveau, je n'aurais pas les compétences nécessaire pour aboutir cette partie
merci par avance pour votre aide...
le problème c'est entre ligne 194 et 205
j'effectue le calcul entre l'heure de mise en route et maintenant et au fur et a mesure que le temps passe j'ai toujours zero...
=====================
contenu du fichier preference.txt ::
=====================
- [Param]
; Extinction Automatique du PC (o/n):
OptionExt = o
; Préavis exprimé en minutes:
Preavis = 5
; Temps attente avant extinction exprimé en minutes:
Extinction = 60
en fait je voudrait lui dire:
** s'il est l'heure de debut de programme + le temps d'attente autorisé - préavis =>> action1 (annoncer qu'il ne reste plus que x minutes...)
** s'il est l'heure de debut de programme + le temps d'attente autorisé =>> action2 (eteindre le pc automatiquement)
la ca devient compliquer pour mon petit cerveau, je n'aurais pas les compétences nécessaire pour aboutir cette partie
merci par avance pour votre aide...
Code : Tout sélectionner
;####################################################
;#### Name: Gestion du Temps PC
;#### Version: 1.0
;#### Date: 05-08-17
;#### PB: PureBasic 5.22 LTS (Windows - x86)
;#### Auth: David TURQUIN
;#### Contrib: falsam, Kwai chang caine, djes // MERCI!!!
;####################################################
;########## initialiser les variables... #########
Global nb_de_lignes_jdb = 0
Global position_lecture = 0
Global Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Global Time$ = FormatDate("%hh:%ii:%ss", Date())
Global TimeEnCours$
Global NomChemin$
NomChemin$ = GetCurrentDirectory()
NomChemin$ = NomChemin$ +"\dt_outils"
Global cible_fichier$ = NomChemin$ +"\JDB.txt"
Global cible_param$ = NomChemin$ +"\param.txt"
Global FicIcon$ = NomChemin$ +"\horloge.ico"
Global OptionExt.s, Preavis.l, Extinction.l
#AProposTitle = "Gestion du Temps PC"
#AProposMess = "v1.0 - Réalisé par David TURQUIN - 08/17" + Chr(10) + "Réalisé avec PureBasic - Diffusion Libre"
;########## chargement des parametres... #########
;-*** Charge fichiers
OpenPreferences(cible_param$)
PreferenceGroup("Param")
OptionExt= ReadPreferenceString("OptionExt", "")
Preavis= ReadPreferenceLong("Preavis", 0)
Extinction= ReadPreferenceLong("Extinction", 0)
ClosePreferences()
;########## compter nb lignes du jdb #########
If ReadFile(0, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
lecture$ = ReadString(0)
nb_de_lignes_jdb = nb_de_lignes_jdb +1
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
nb_de_lignes_jdb = 0
EndIf
;########## mettre en mémoire les infos du jdb #########
Dim ligne_information.s(nb_de_lignes_jdb)
If ReadFile(0, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
ligne_information(position_lecture) = ReadString(0)
position_lecture= position_lecture +1
; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
; MessageRequester("","le fichier ne peut être lu===")
EndIf
;########## va enregistrer le journal de bord avec les infos complémentaires /// OUVERTURE
CreateFile(0, cible_fichier$)
For affichage = 0 To nb_de_lignes_jdb-1
WriteStringN(0, ligne_information(affichage))
Next affichage
WriteStringN(0, "O "+Date$+" "+Time$)
CloseFile(0)
;########## va enregistrer le journal de bord avec les infos complémentaires /// FERMETURE
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Protected result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_ENDSESSION, #WM_CLOSE
nb_de_lignes_jdb = 0
position_lecture = 0
;########## compter nb lignes du jdb #########
If ReadFile(1, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
lecture$ = ReadString(1)
nb_de_lignes_jdb = nb_de_lignes_jdb +1
Wend
CloseFile(1) ; Ferme le fichier précédemment ouvert
Else
MessageRequester("Problème d'accès au JDB",cible_fichier$, #MB_ICONERROR)
EndIf
;########## mettre en mémoire les infos du jdb #########
Dim ligne_information.s(nb_de_lignes_jdb)
If ReadFile(0, cible_fichier$) ;===Si le fichier peut être lu , on met en mémoire les données qu'il contient===
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
ligne_information(position_lecture) = ReadString(0)
position_lecture= position_lecture +1
; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
; MessageRequester("","le fichier ne peut être lu===")
EndIf
;########## va enregistrer le journal de bord avec les infos complémentaires /// OUVERTURE
CreateFile(0, cible_fichier$)
For affichage = 0 To nb_de_lignes_jdb-1
WriteStringN(0, ligne_information(affichage))
Next affichage
WriteStringN(0, "N "+Date$+" "+Time$)
CloseFile(0)
EndSelect
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 400, 400, "#WM_ENDSESSION", #PB_Window_Invisible)
CreatePopupMenu(1)
MenuItem(1,"- Extraction Journal De Bord")
MenuItem(2,"- Gestion du Temps")
MenuItem(3,"A propos")
AddSysTrayIcon(0, WindowID(0), LoadImage(0, FicIcon$))
SetWindowCallback(@WinCallback())
Repeat
If Extinction$="o"
TimeEnCours$ = FormatDate("%hh:%ii:%ss", Date())
; OptionExt= ReadPreferenceString("OptionExt", "")
; Preavis= ReadPreferenceLong("Preavis", 0)
; Extinction= ReadPreferenceLong("Extinction", 0)
; reponse.s = Str(Val(TimeEnCours$)-Val(Time$)-Preavis)
Debug reponse
Delay (1000)
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_SysTray
DisplayPopupMenu(1, WindowID(0))
Case #PB_Event_Menu
Select EventMenu()
Case 1 ; Extraction Journal De Bord
MessageRequester("xtraction Journal De Bord","xtraction Journal De Bord")
Case 2 ; Gestion du Temps
MessageRequester("Gestion du Temps","Gestion du Temps")
Case 3 ; A propos
MessageRequester(#AProposTitle,#AProposMess)
EndSelect
EndSelect
ForEver
EndIf
Dernière modification par david le sam. 05/août/2017 12:12, modifié 3 fois.
Re: compteur temps passé sur ordinateur alumé
Si je peux te suggérer un truc pour te faciliter la vie, c'est d'utiliser la lib preferences pour tes fichiers. C'est du bonheur ! Et écris ton algo sur une feuille de papier, ça t'aidera à y voir plus clair...
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: compteur temps passé sur ordinateur alumé
Par avance, c'est bien, etant donné "qu'après".... tu ne réponds même pas a celle que l'on t'apportesDavid a écrit :merci par avance pour votre aide...

http://www.purebasic.fr/french/viewtopi ... 83#p194383
Re: compteur temps passé sur ordinateur alumé
oui c'est vrai, je te prie de m'excuserKwai chang caine a écrit :Par avance, c'est bien, etant donné "qu'après".... tu ne réponds même pas a celle que l'on t'apportesDavid a écrit :merci par avance pour votre aide...
http://www.purebasic.fr/french/viewtopi ... 83#p194383
j'avais bien lu ton message, et même si je ne comprends pas tout au vu de mon faible niveau pour coder, cela m'a permis de faire un choix quand à la direction a prendre pour l'intégrer au mieux...
pardon pardon!!
hors mis le fait que ça fait parti du code de bonne conduite, normalement avec mon éducation j'aurais du te remercier
très sincèrement j'étais très absorbé à l'idée de (presque) pouvoir y arriver et j'en ai oublié jusqu'au plus important: l'échange
merci encore pour tout
Re: compteur temps passé sur ordinateur alumé
merci du conseildjes a écrit :Si je peux te suggérer un truc pour te faciliter la vie, c'est d'utiliser la lib preferences pour tes fichiers. C'est du bonheur ! Et écris ton algo sur une feuille de papier, ça t'aidera à y voir plus clair...
je viens de regarder dans l'aide, c'est clair, je viens déjà de l'adapter
c'est sur que ça va être plus pratique pour ranger les informations!
Re: compteur temps passé sur ordinateur alumé
Ton message est d'une qualité, d'une subtilité et d'un aérodynamisme, tel que je suis époustouflé.Kwai Chewing Gum a écrit :La procédure WindowCallBack n'est pas une procédure comme les autres, c'est une
procédure système, bas niveau
C'est un héritage de la gestion évènementielle du C, en fait une porte ouverte sur
l'ensemble des actions qu’exécute windows
Avant de faire quoi que ce soit, il passe par là
Tu ne peux sortir le code qui est dedans
Pour certaines utilisations (rapidité, intervention au coeur de windows), il est difficile, voir
même impossible de s'en passer
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: compteur temps passé sur ordinateur alumé
Tu es tout pardonné

Des remerciements, ça fait tres souvent plaisir à ceux qui essaient d'aider, mais c'est la cerise sur le kebab, c'est pas une obligation

Du moment que ça t'as servi à quelque chose, le but initial est rempli, et une simple réponse donne au minimum l'impression d'avoir été lu.
Si une réponse te paraît compliquée et t'interpelle "somewhere", faut pas hesiter à demander des précisions, on est là pour ça.
Si tu savais le nombre de programmeurs professionnels de haut niveau qui sont au bout de la dépression après avoir essayé de me faire comprendre quelque chose.. j'suis le meilleur des pires, donc je sais de quoi je parle à ce sujet

@Ollivier avec 2 L
Et oui...ne t'en déplaise, je suis capable de faire une phrase technique, sans y glisser un "caca boudin" ou "tute tute pouet pouet"

Tu te plains que je te parle, ce qui est ton droit le plus strict, et quand je respecte tes desiderata et donc t'évite au maximum , tu t'adresses à moi dans un style neutre qui pourrait être pris aussi bien sur le ton de l'humour, chose que j'ai maintes fois pu prouver que j'appréciais, soit sur un ton sarcastique, que j'apprécie nettement moins.
Je n'aurais jamais la chance de posséder, ne serait ce que 1% des 2000 chevaux turbos, qui au fur et à mesure de tes ecrits paraissent difficilement maitrisables, et que ton cerveau a sous le capot, mais je suis en mesure de comprendre si il faut que j'évite certains membres qui ne m'apprecient pas, ce que je respecte totalement.
Mais avec toi, on a souvent du mal à te suivre, que ce soit par les ecits comme le comportement.
Alors un peu de lumière, me serait d'un grand secour, sur ce que je doit faire avec toi.
Car me faire botter le cul sans raison, et sans répondre, j'suis pas fan, tu te trompes de barbu

Re: compteur temps passé sur ordinateur alumé
bon, mes lignes 15 et 23 sont faites juste apres le repeat
(et avant les selectevent & co)
donc
je ne comprends pas pourquoi ils ne fonctionnent que quand ma souris est sur l'icone de ma fenetre minimizée et non en permanence alors que le programme tourne en permanence en arriere plan??
inutile de vous dire que j'ai essayé de les déplacer partout dans ma boucle, je ne vois pas d'où vient le pb..
(et avant les selectevent & co)
donc
je ne comprends pas pourquoi ils ne fonctionnent que quand ma souris est sur l'icone de ma fenetre minimizée et non en permanence alors que le programme tourne en permanence en arriere plan??
inutile de vous dire que j'ai essayé de les déplacer partout dans ma boucle, je ne vois pas d'où vient le pb..
Code : Tout sélectionner
If OpenWindow(0, EcrL/3, EcrH/3, EcrL/3, EcrH/3, #montexte, #PB_Window_Invisible)
; ButtonGadget(666, EcrL/6, EcrH/6, EcrL/6, EcrH/6, "MASQUER LA FENETRE")
CreatePopupMenu(1)
MenuItem(1,"- Extraction Journal De Bord")
MenuItem(2,"- Gestion du Temps")
MenuItem(3,"A propos")
AddSysTrayIcon(0, WindowID(0), LoadImage(0, FicIcon$))
SetWindowCallback(@WinCallback())
Repeat
If OptionExt="o" And passage="n"
If ElapsedMilliseconds() - t > (Extinction*1000*60 - Preavis*1000*60)
SetWindowTitle(0, #montexte+ ": "+Str(preavis)+" "+"minute(s)")
SetWindowState(0, #PB_Window_Normal )
passage="o":Debug "a"
EndIf
EndIf
If OptionExt="o" And passage="o"
If ElapsedMilliseconds() - t > Extinction*1000*60
Debug "b"
;RunProgram("C:\Windows\System32\Shutdown.exe", "-p","")
End
EndIf
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_SysTray
DisplayPopupMenu(1, WindowID(0))
Case #PB_Event_Menu
Select EventMenu()
Case 1 ; Extraction Journal De Bord
Debug "xtraction Journal De Bord"
Case 2 ; Gestion du Temps
Debug "Gestion du Temps"
Case 3 ; A propos
MessageRequester(#AProposTitle,#AProposMess)
EndSelect
; Case 666 ***mal géré ne fonctionne pas
; SetWindowState(0, #PB_Window_Invisible )
EndSelect
ForEver
EndIf
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: compteur temps passé sur ordinateur alumé
WaitWindowEvent () comme son nom l'indique, attend une action sur la fenetre.
Du coups tu bloques la boucle.
Dans ton cas, un windowevent() simple avec un delay derriere pour ne pas charger de trop le proce, ou bien un WaitWindowEvent(10) ou 100 (à essayer) qui attend que 10 ms, si il n'y a pas d'événements fenetre
Du coups tu bloques la boucle.
Dans ton cas, un windowevent() simple avec un delay derriere pour ne pas charger de trop le proce, ou bien un WaitWindowEvent(10) ou 100 (à essayer) qui attend que 10 ms, si il n'y a pas d'événements fenetre

Re: compteur temps passé sur ordinateur alumé
Merci, j'ai modifié, ça marche impec
par contre je n'arrive pas assimiler pourquoi je bloque ma boucle
enfin le principal c'est que ça fonctionne!!!
moi je me disais:
1/ REPEAT
2/ mon code qui est bloqué à cause de WaitWindowEvent () alors que celui-ci n'intervient qu'après (/3)
3/ mon WaitWindowEvent () blocant pour les opérations qui le suivent, là ça me semblait normal mais qui bloque aussi ce que j'ai mis avant? (/2)
4/ select-case & co...
5/ FOREVER
par contre je n'arrive pas assimiler pourquoi je bloque ma boucle
enfin le principal c'est que ça fonctionne!!!
moi je me disais:
1/ REPEAT
2/ mon code qui est bloqué à cause de WaitWindowEvent () alors que celui-ci n'intervient qu'après (/3)
3/ mon WaitWindowEvent () blocant pour les opérations qui le suivent, là ça me semblait normal mais qui bloque aussi ce que j'ai mis avant? (/2)
4/ select-case & co...
5/ FOREVER
Re: compteur temps passé sur ordinateur alumé
Ton programme s'arrête sur WaitWindowEvent() jusqu'à ce qu'un événement le réveille. Quand tu mets un nombre x en paramètre, même s'il n'y a aucun événement, ton programme reprendra son déroulement passées x millisecondes .