Page 1 sur 2

compteur temps passé sur ordinateur allumé

Publié : ven. 04/août/2017 9:08
par david
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

Re: compteur temps passé sur ordinateur alumé

Publié : ven. 04/août/2017 10:04
par falsam

Re: compteur temps passé sur ordinateur alumé

Publié : ven. 04/août/2017 13:08
par david
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

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 

Re: compteur temps passé sur ordinateur alumé

Publié : ven. 04/août/2017 19:15
par Kwai chang caine
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 :wink:
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é

Publié : sam. 05/août/2017 9:18
par david
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 ::
=====================
  • [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 

Re: compteur temps passé sur ordinateur alumé

Publié : sam. 05/août/2017 9:49
par djes
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...

Re: compteur temps passé sur ordinateur alumé

Publié : sam. 05/août/2017 10:33
par Kwai chang caine
David a écrit :merci par avance pour votre aide...
Par avance, c'est bien, etant donné "qu'après".... tu ne réponds même pas a celle que l'on t'apportes :?
http://www.purebasic.fr/french/viewtopi ... 83#p194383

Re: compteur temps passé sur ordinateur alumé

Publié : sam. 05/août/2017 10:47
par david
Kwai chang caine a écrit :
David a écrit :merci par avance pour votre aide...
Par avance, c'est bien, etant donné "qu'après".... tu ne réponds même pas a celle que l'on t'apportes :?
http://www.purebasic.fr/french/viewtopi ... 83#p194383
oui c'est vrai, je te prie de m'excuser
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é

Publié : sam. 05/août/2017 10:48
par david
djes 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...
merci du conseil
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é

Publié : sam. 05/août/2017 11:48
par Ollivier
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
Ton message est d'une qualité, d'une subtilité et d'un aérodynamisme, tel que je suis époustouflé.

Re: compteur temps passé sur ordinateur alumé

Publié : sam. 05/août/2017 14:42
par Kwai chang caine
    @David
    Tu es tout pardonné :wink:

    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 :D
    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 :mrgreen:

    @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" :mrgreen:

    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 :mrgreen:

    Re: compteur temps passé sur ordinateur alumé

    Publié : lun. 07/août/2017 17:11
    par david
    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..

    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 

    Re: compteur temps passé sur ordinateur alumé

    Publié : mar. 08/août/2017 8:03
    par Kwai chang caine
    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 :wink:

    Re: compteur temps passé sur ordinateur alumé

    Publié : mar. 08/août/2017 10:38
    par david
    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

    Re: compteur temps passé sur ordinateur alumé

    Publié : mar. 08/août/2017 13:08
    par djes
    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 .