Page 1 sur 1

Arrêt programmé

Publié : jeu. 21/oct./2004 10:41
par Le Soldat Inconnu
Un code super somplexe qui permet d'arrêter l'ordi, de le redémarrer ou d'arrêter la session au bout d'un certain temps.

J'ai mis, oula, bien 10 minutes à le faire :lol:

Ca sert à rien ou a peu de chose mais bon, ça peut servir :wink:

Vous trouverez l'exe sur mon site

Code : Tout sélectionner

Procedure ComputerShutDown(Param.l)
  ; Param = paramètre d'instinction de l'ordinateur
  ; 1 : quitter session
  ; 2 : arrêter
  ; 3 : redémarrer
 
  #TOKEN_ADJUST_PRIVILEGES = 32
  #TOKEN_QUERY = 8
  #SE_PRIVILEGE_ENABLED = 2
  #EWX_LOGOFF = 0
  #EWX_SHUTDOWN = 1
  #EWX_REBOOT = 2
  #EWX_FORCE = 4
  #EWX_POWEROFF = 8
  
  Structure MyLUID
    LowPart.l
    HighPart.l
    Attributes.l
  EndStructure
  
  Structure MyTOKEN
    PrivilegeCount.l
    LowPart.l
    HighPart.l
    Attributes.l
  EndStructure
  
  Protected hdlTokenHandle.l, tmpLuid.MyLUID, tkp.MyTOKEN, tkpNewButIgnored.MyTOKEN, lBufferNeeded.l

  OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle)
  SysName.s = "" + Chr(0)
  Name.s = "SeShutdownPrivilege" + Chr(0)
  LookupPrivilegeValue_(SysName, Name, @tmpLuid)
  tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED
  tkp\PrivilegeCount = 1
  tkp\LowPart = tmpLuid\LowPart
  tkp\HighPart = tmpLuid\HighPart
  tkp\Attributes = tmpLuid\Attributes
  AdjustTokenPrivileges_(hdlTokenHandle, 0, @tkp, SizeOf(MyTOKEN), @tkpNewButIgnored, @lBufferNeeded)
  
  Select Param
    Case 1 : ExitWindowsEx_(#EWX_LOGOFF | #EWX_FORCE, 0)
    Case 2 : ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
    Case 3 : ExitWindowsEx_(#EWX_REBOOT | #EWX_FORCE, 0)
  EndSelect
  
EndProcedure

#TailleX = 210
#TailleY = 80

; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, #TailleX, #TailleY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Arrêt") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

FontID = LoadFont(1, "Tahoma", 8, #PB_Font_Bold)
TextGadget(2, 5, 3, #TailleX - 10, 15, "Arrêt de l'ordinateur dans")
SetGadgetFont(2, FontID)
Taille = (#TailleX - 6) / 6
StringGadget(3, 3, 18, Taille, 20, "", #PB_String_Numeric)
TextGadget(#PB_Any, 3 + Taille, 20, Taille, 20, " h")
StringGadget(4, 3 + 2 * Taille, 18, Taille, 20, "", #PB_String_Numeric)
TextGadget(#PB_Any, 3 + 3 *Taille, 20, Taille, 20, " min")
StringGadget(5, 3 + 4 * Taille, 18, Taille, 20, "", #PB_String_Numeric)
TextGadget(#PB_Any, 3 + 5 * Taille, 20, Taille, 20, " s")
ButtonGadget(1, 3, 40, #TailleX - 6, 23, "Lancer")
SetGadgetFont(1, FontID)
Taille = (#TailleX - 6) / 2
ButtonGadget(6, 3, 40, Taille, 23, "Annuler")
SetGadgetFont(6, FontID)
HideGadget(6, 1)
ButtonGadget(7, 3 + Taille, 40, Taille, 23, "Pause")
SetGadgetFont(7, FontID)
HideGadget(7, 1)
CheckBoxGadget(8, 3, 65, #TailleX - 6, 15, "Rédémarrer l'ordinateur")

Type = 2

Repeat
  Event = WaitWindowEvent()
  
  If Event = #WM_TIMER
    ; Décompte
    sec - 1
    If sec < 0
      Min - 1
      sec = 59
      If Min < 0
        Heure - 1
        Min = 59
        If Heure < 0
          ComputerShutDown(Type)
          End
        EndIf
        SetGadgetText(3, Str(Heure)) ; Affichages des heures
      EndIf
      SetGadgetText(4, Str(Min)) ; Affichage des minutes
    EndIf
    ; Affichage des secondes
    SetGadgetText(5, Str(sec))
    
  ElseIf Event = #PB_EventGadget
    Select EventGadgetID() ; boutons, zone de texte, ...
      Case 1 ; Lancer
        Timer = SetTimer_(WindowID(), 0, 1000, 0)
        HideGadget(1, 1)
        HideGadget(6, 0)
        HideGadget(7, 0)
        Heure = Val(GetGadgetText(3))
        Min = Val(GetGadgetText(4))
        sec = Val(GetGadgetText(5))
      Case 6 ; Annuler
        Event = #PB_EventCloseWindow
      Case 7 ; Pause
        KillTimer_(WindowID(), 0)
        Timer = 0
        HideGadget(1, 0)
        HideGadget(6, 1)
        HideGadget(7, 1)
      Case 8
        If Type = 2
          Type = 3
          SetGadgetText(2, "Redémarrage de l'ordinateur dans")
          SetGadgetText(8, "Fermer la session")
          SetGadgetState(8, 0)
          SetWindowTitle(0, "Redémarrage")
        ElseIf Type = 3
          Type = 1
          SetGadgetText(2, "Fermer la session dans")
          SetGadgetText(8, "Arrêter l'ordinateur")
          SetGadgetState(8, 0)
          SetWindowTitle(0, "Fin de session")
        Else
          Type = 2
          SetGadgetText(2, "Arrêt de l'ordinateur dans")
          SetGadgetText(8, "Rédémarrer l'ordinateur")
          SetGadgetState(8, 0)
          SetWindowTitle(0, "Arrêt")
        EndIf
          
          
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow

If Timer 
  KillTimer_(WindowID(), 0)
EndIf

End

Publié : jeu. 21/oct./2004 10:43
par Crystal Noir
Super !

Maintenant tu n'as plus qu'à faire un snippet qui permettrait d'allumer le PC lorsqu'il est éteint :)

C'est possible ? :jesors:

Publié : jeu. 21/oct./2004 10:47
par Le Soldat Inconnu
Oui, tu programmes ton doigt pour qu'il appuit sur le bouton marche du PC :lol: et au pasage, tu te le mets dans l'oeil pour t'apprendre à dire des bétises :jesors:

Publié : mar. 09/nov./2004 16:01
par gansta93
ça serait bien que l'on puisse le minimiser dans la barre des tâches (dès que l'on clique sur un bouton ou sur le symbol) pour pas avoir tout le temps la fenêtre à l'écran.

Publié : mar. 09/nov./2004 18:13
par Thyphoon
Oui, tu programmes ton doigt pour qu'il appuit sur le bouton marche du PC et au pasage, tu te le mets dans l'oeil pour t'apprendre à dire des bétises
Il y a une solution ... demarrage via la carte reseau !
Imagine un reseau ou chaque ordinateur communique et si un ordinateur s'eteind avant il envoie l'information sur le reseau quand il doit se rallumer ! et les ordinateurs allumé eux s'occuperont d'envoyer la commande. Et si d'autre ordinateur s'allume entre temps eux aussi mette a jour leur tableau de redemarrage en interogeant les pcs déjà allumer... :D