Connaitre le temps d'inactivité d'un PC (Résolu et merci !)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 819
Inscription : lun. 26/janv./2004 14:37

Connaitre le temps d'inactivité d'un PC (Résolu et merci !)

Message par brossden »

Bonjour à tous
Est-il possible de connaitre le temps d'inactivité sur un PC, soit pas de déplacement de la souris, ni frappe sur le clavier.
Merci d'avance à ceux qui se pencheront sur ce problème !
Dernière modification par brossden le jeu. 07/mars/2024 6:43, modifié 1 fois.
Denis

Bonne Jounée à tous
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Connaitre le temps d'inactivité d'un PC

Message par boddhi »

Salut,

Ce code pourra certainement t'aider.
D'avance, pardon à l'auteur, car je ne sais plus d'où provient le code.
Edit: L'auteur est Infratec (post original ici)

Code : Tout sélectionner

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
CompilerEndIf

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    Procedure.i GetIdleTime()
      Static LastTime.q
      Static LastDwTime.l
      Protected lii.LASTINPUTINFO
      Protected Result.i
      
      lii\cbSize = SizeOf(LASTINPUTINFO)
      If GetLastInputInfo_(@lii)
        If LastTime = 0
          LastTime = Date()
        EndIf
        If LastDwTime = 0
          LastDwTime = lii\dwTime
        EndIf
        
        ;Debug "lii\dwTime: " + Str(lii\dwTime)
        If lii\dwTime <> LastDwTime
          LastDwTime = lii\dwTime
          ;Debug "LastDwTime: " + Str(LastDwTime)
          LastTime = Date()
        EndIf
        Result = Date() - LastTime
      EndIf
      
      ProcedureReturn Result
    EndProcedure
  CompilerCase #PB_OS_Linux
    Structure XScreenSaverInfo Align #PB_Structure_AlignC
      window.i        ; screen saver window
      state.l         ; ScreenSaver{Off,On,Disabled}
      kind.l          ; ScreenSaver{Blanked,Internal,External}
      til_or_since.i  ; milliseconds
      idle.i          ; milliseconds
      eventMask.l     ; events
    EndStructure
    
    Macro DefaultRootWindow(disp)
      XDefaultRootWindow(disp)
    EndMacro
    
    ImportC "-lX11"
      XOpenDisplay.i(display.p-utf8)
      XCloseDisplay.i(*display)
      XDefaultRootWindow.i(*display)
    EndImport
    
    ImportC "-lXss"
      XScreenSaverQueryExtension.i(*dpy, *event_base_return, *error_base_return)
      XScreenSaverQueryInfo(*dpy, drawable.i, *saver_info.XScreenSaverInfo)
    EndImport
    
    Procedure.i GetIdleTime()
      Protected *display
      Protected event_base.i, error_base.i
      Protected info.XScreenSaverInfo
      Protected Result.i
      
      *display = XOpenDisplay("")
      If *display
        If XScreenSaverQueryExtension(*display, @event_base, @error_base)
          If XScreenSaverQueryInfo(*display, DefaultRootWindow(*display), @info)
            ;       Debug info\window
            ;       Debug info\state
            ;       Debug info\kind
            ;       Debug info\til_or_since
            ;       Debug info\idle
            ;       Debug info\eventMask
            Result = info\idle / 1000
          EndIf
        Else
          Debug "Error: XScreenSaver Extension not present"
        EndIf
        XCloseDisplay(*display)
      EndIf
      
      ProcedureReturn Result
    EndProcedure
    
  CompilerCase #PB_OS_MacOS
    #kCGAnyInputEventType = ~0
    #hidSystemState = 1
    
    ImportC ""
      CGEventSourceSecondsSinceLastEventType.d(CGEventSourceStateID.l,CGEventType.l)
    EndImport
    
    Procedure.i GetIdleTime()
      ProcedureReturn Int(CGEventSourceSecondsSinceLastEventType(#hidSystemState,#kCGAnyInputEventType))
    EndProcedure
CompilerEndSelect


;-Demo
CompilerIf #PB_Compiler_IsMainFile
  Define i.i
  
  For i = 0 To 20
    Debug GetIdleTime()
    Delay(1000)
  Next i
CompilerEndIf
Dernière modification par boddhi le lun. 04/mars/2024 23:14, modifié 1 fois.
brossden
Messages : 819
Inscription : lun. 26/janv./2004 14:37

Re: Connaitre le temps d'inactivité d'un PC

Message par brossden »

Merci boddhi c'est exactement ce dont j'avais besoin !
Par contre comme je suis sous Windows une grande partie du code m'est inutile on peut largement simplifier !

Code : Tout sélectionner

   Procedure.i GetIdleTime()
      Static LastTime.q
      Static LastDwTime.l
      Protected lii.LASTINPUTINFO
      Protected Result.i
      
      lii\cbSize = SizeOf(LASTINPUTINFO)
      If GetLastInputInfo_(@lii)
        If LastTime = 0
          LastTime = Date()
        EndIf
        If LastDwTime = 0
          LastDwTime = lii\dwTime
        EndIf
        
        ;Debug "lii\dwTime: " + Str(lii\dwTime)
        If lii\dwTime <> LastDwTime
          LastDwTime = lii\dwTime
          ;Debug "LastDwTime: " + Str(LastDwTime)
          LastTime = Date()
        EndIf
        Result = Date() - LastTime
      EndIf
      ProcedureReturn Result
    EndProcedure
  
;-Demo
CompilerIf #PB_Compiler_IsMainFile
  Define i.i
  
  For i = 0 To 20
    Debug GetIdleTime()
    Delay(1000)
  Next i
CompilerEndIf
Denis

Bonne Jounée à tous
brossden
Messages : 819
Inscription : lun. 26/janv./2004 14:37

Re: Connaitre le temps d'inactivité d'un PC

Message par brossden »

Voici la raison de ma demande ici

je veux que mon pC s'arrête si je ne me sers pas de la souris ni du clavier pendant environ 10 minutes mon PC doit s'éteindre tout seul !
Mon code est le suivant :

Code : Tout sélectionner

Procedure.i GetIdleTime()
  Static LastTime.q
  Static LastDwTime.l
  Protected lii.LASTINPUTINFO
  Protected Result.i
  
  lii\cbSize = SizeOf(LASTINPUTINFO)
  If GetLastInputInfo_(@lii)
    If LastTime = 0
      LastTime = Date()
    EndIf
    If LastDwTime = 0
      LastDwTime = lii\dwTime
    EndIf
    If lii\dwTime <> LastDwTime
      LastDwTime = lii\dwTime
      LastTime = Date()
    EndIf
    Result = Date() - LastTime
  EndIf
  ProcedureReturn Result
EndProcedure
  

CompilerIf #PB_Compiler_IsMainFile
  Define i.i
    
  Repeat
    
    x = GetIdleTime()
    Debug x
  If  x>= 600 ; 10 x 60 = 600 secondes
     RunProgram("cmd.exe", "/c shutdown /s /t 0 ","")

  EndIf
  
    Delay(1000)
  ForEver
CompilerEndIf
J'ai modifié les options de shutdown qui ne fonctionne pas dans certains cas !
Dernière modification par brossden le dim. 10/mars/2024 14:27, modifié 3 fois.
Denis

Bonne Jounée à tous
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Connaitre le temps d'inactivité d'un PC

Message par boddhi »

Salut Brossden

Merci pour d'avoir partagé tes codes. :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Connaitre le temps d'inactivité d'un PC

Message par Ar-S »

Très cool !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
brossden
Messages : 819
Inscription : lun. 26/janv./2004 14:37

Re: Connaitre le temps d'inactivité d'un PC

Message par brossden »

De rien Ar-s je vous dois bien cela à tous ici, vous êtes très efficaces pour moi !

J'ai modifié les options de shutdown qui ne fonctionne pas dans certains cas !
Denis

Bonne Jounée à tous
Répondre