Page 1 sur 1

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

Publié : ven. 01/mars/2024 9:49
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 !

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

Publié : ven. 01/mars/2024 21:02
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

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

Publié : sam. 02/mars/2024 16:48
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

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

Publié : dim. 03/mars/2024 15:28
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 !

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

Publié : lun. 04/mars/2024 23:12
par boddhi
Salut Brossden

Merci pour d'avoir partagé tes codes. :wink:

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

Publié : mar. 05/mars/2024 11:50
par Ar-S
Très cool !

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

Publié : mar. 05/mars/2024 14:40
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 !