Arrêt programmé

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Arrêt programmé

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message 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.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
Répondre