Seite 1 von 3

Zur bestimmten Zeit ein Ereigniss ausführen

Verfasst: 31.08.2008 16:00
von KruemelMonster
Ich will meinen PC zu einer bestimmten Zeit herunterfahren.
Zuerst hab ich das Aktuelle Systemdatum eingeladen trotzdem
will er nicht so recht die Zeit-/Zahlenfressen die ich in die Stringgadgets
eingetragen hab.
Lass ich aber die Stringgadgets frei, fährt er den PC herunter so wie es eigenlich bei der bestimmten Zeit tun sollte.

Code: Alles auswählen

Enumeration
;Benötigt für Programmbefehle
  #Window_0
  #Start_Shutdown
  #Close_Window
  #Check
;Zeit
  #Hour
  #Minuts
  #Second

  
EndEnumeration

Procedure Open_Window()
  If OpenWindow(#Window_0, 110, 110, 300, 80, "Shoutdowner", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered )
    If CreateGadgetList(WindowID(#Window_0))
    ButtonGadget(#Start_Shutdown, 10, 10, 87, 30,"Start Shutdown")
    ButtonGadget(#Close_Window,10, 40, 87, 30,"Close Window")
    StringGadget(#Hour,110,10,21,21,"", #PB_String_Numeric )
    SendMessage_(GadgetID(#Hour), #EM_LIMITTEXT, 2, 0)
    StringGadget(#Minuts,130,10,21,21,"", #PB_String_Numeric)
    SendMessage_(GadgetID(#Minuts), #EM_LIMITTEXT, 2, 0)
    StringGadget(#Second,150,10,21,21,"", #PB_String_Numeric)
    SendMessage_(GadgetID(#Second), #EM_LIMITTEXT, 2, 0)
    CheckBoxGadget(#Check, 110,  52, 250, 21, "Abfrage für Ausschalten des PC's")  
    EndIf
  EndIf  
EndProcedure 

Procedure Init_Zeit()
  Zeit.l = Date()
    HH$ = FormatDate("%hh", Zeit) 
    MM$ = FormatDate("%ii", Zeit) 
    SS$ = FormatDate("%ss", Zeit)
EndProcedure

Open_Window()
Init_Zeit()


;------------------------------------------------------------------- 
    ;Hauptteil
;------------------------------------------------------------------- 


Repeat
  Select WaitWindowEvent()            
     Case #PB_Event_CloseWindow
       Break       
     Case #PB_Event_Gadget     
        Select EventGadget()
          Case #Close_Window
            Break
          Case #Start_Shutdown      
              If HH$=GetGadgetText(#Hour)           
                If MM$=GetGadgetText(#Minuts) 
                  If SS$=GetGadgetText(#Second)                 
                    If GetGadgetState(#Check)              
                     Shutdown = MessageRequester("Start Shutdown", "Wollen Sie den PC herunterfahren?", #PB_MessageRequester_YesNo)
                      If Shutdown = #PB_MessageRequester_Yes
                      RunProgram("C:\WINDOWS\System32\shutdown", "-f -s -t 00", "")                                 
                      EndIf
                        Else 
                        Debug 0 ;RunProgram("C:\WINDOWS\System32\shutdown", "-f -s -t 00", "")                
                    EndIf
                  EndIf
                EndIf
              EndIf      
        EndSelect
  EndSelect
       
       
       
Until Event = #PB_Event_CloseWindow 

Verfasst: 31.08.2008 16:38
von ts-soft
Als erstes brauchste eine Timerprocedure, such mal nach TimerCallback.
Das wird dann in einem von dir bestimmten Intervall aufgerufen, je nach
benötigter Genauigkeit, und da vergleichste die aktuelle Zeit mit der
eingestellten.

Zum Shutdown sollteste besser folgendes verwenden:

Code: Alles auswählen

Procedure EnableShutDown()
  Protected Privileges.TOKEN_PRIVILEGES
  Protected hToken.l
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure

EnableShutDown()
ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
Die obere Procedure ist ab Windows 2000 erforderlich, damit Dein
Programm die Rechte zum beenden hat.
Die Parameter für ExitWindowsEx_ findeste hier:
MSDN-ExitWindowsEx

Verfasst: 31.08.2008 20:03
von gnasen
Hilft das hier?

Start -> Alle Programme -> Zubehör -> Systemprogramme -> geplante Tasks

Wäre eine schon vorhandene Alternative für Windows

Verfasst: 31.08.2008 20:17
von KruemelMonster
Danke auf jedenfall.
Hab zwar ein Link dazu gefunden aber dahinter steig ich nicht gerade. :freak:
würde ich wirklich freuen wenn mir da jemanden helfen könnte und
mir das erklärt

MfG Kruemel

Verfasst: 31.08.2008 20:28
von ts-soft

Code: Alles auswählen

Procedure EnableShutDown()
  Protected Privileges.TOKEN_PRIVILEGES
  Protected hToken.l
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure


Procedure WndProc(hWnd, uMsg, wParam, lParam)
  If uMsg = #WM_TIMER
    ; hier prüfen ob die eingestellte Zeit >= aktuelle Zeit
    ; wenn ja: 
    ;EnableShutDown()
    ;ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WndProc())
  SetTimer_(WindowID(0), 0, 2000, 0)
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf : End
Erklärung in meinem ersten Beitrag, sowie im Callback

Verfasst: 03.09.2008 22:45
von KruemelMonster
Wie immer ein Dankeschön für die Hilfsbereitschaft. :)
Hab erstmal ein wenig mit der Procedure rum probiert und hab sie
wohl verstanden, blos jetzt weiß ich nicht wie ich die eingegebene Zeit mit
der Systemzeit vergleichen lass.
Ich möchte keinen ganzen Code haben nur diesen abschnitt hier.

Code: Alles auswählen

 Procedure WndProc(hWnd, uMsg, wParam, lParam)
...
    ; hier prüfen ob die eingestellte Zeit >= aktuelle Zeit 
...
EndProcedure 
mfg Kruemel

Verfasst: 03.09.2008 23:01
von ts-soft
Hier noch nen Kruemel :wink:

Code: Alles auswählen

Procedure WndProc(hWnd, uMsg, wParam, lParam)
...
  ; hier prüfen ob die eingestellte Zeit >= aktuelle Zeit
  Protected eingestellteZeit.l = Date(Year(Date()), Month(Date()), Day(Date()), Val(GetGadgetText(#Hour)), Val(GetGadgetText(#Minuts)), Val(GetGadgetText(#Second)))

  If eingestellteZeit >= Date()
    EnableShutDown()
    ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
  EndIf
...
EndProcedure
Gruß
Thomas

Verfasst: 06.09.2008 00:02
von KruemelMonster
Der Krümel hat mir gut weiter geholfen. :wink:
Auf jedenfall ein danke dafür, bloss es hat sich ein kleines
Problem aufgetan geht um den Zeilen abschnitt

"If eingestellteZeit=Date()"

Da führt er nicht das Ereignis aus wenn die Zeit mit der Eingestellten übereinstimmt hab auch schon rum probiert wenn es größer (">=")oder kleiner("<=") ist nimmer er nur die werte an die halt größer oder kleiner sind an.
Das ist das letzte Stück was mir fehlt bevor das Programm fertig ist.

Code: Alles auswählen

Enumeration
;Benötigt für Programmbefehle
  #Window_0
  #Start_Shutdown
  #Close_Window
  #Check
;Zeit
  #Hour
  #Minuts
  #Second
EndEnumeration

Procedure Open_Window()
  If OpenWindow(#Window_0, 110, 110, 300, 80, "Shoutdowner Alpha1.1", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered )
    If CreateGadgetList(WindowID(#Window_0))
       ButtonGadget(#Start_Shutdown, 10, 10, 87, 30,"Start Shutdown")
       ButtonGadget(#Close_Window,10, 40, 87, 30,"Close Window")
       StringGadget(#Hour,110,10,21,21,"", #PB_String_Numeric )
       SendMessage_(GadgetID(#Hour), #EM_LIMITTEXT, 2, 0)
       StringGadget(#Minuts,130,10,21,21,"", #PB_String_Numeric)
       SendMessage_(GadgetID(#Minuts), #EM_LIMITTEXT, 2, 0)
       StringGadget(#Second,150,10,21,21,"", #PB_String_Numeric)
       SendMessage_(GadgetID(#Second), #EM_LIMITTEXT, 2, 0)
       CheckBoxGadget(#Check, 110, 52, 250, 21, "Abfrage für Ausschalten des PC's")
    EndIf
  EndIf  
EndProcedure 

Procedure EnableShutDown()
  Protected Privileges.TOKEN_PRIVILEGES
  Protected hToken.l
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure

Open_Window()
EnableShutDown()

Procedure WndProc(hWnd, uMsg, wParam, lParam)
  ;hier prüfen ob die eingestellte Zeit >= aktuelle Zeit
  Protected eingestellteZeit.l = Date(Year(Date()), Month(Date()), Day(Date()), Val(GetGadgetText(#Hour)), Val(GetGadgetText(#Minuts)), Val(GetGadgetText(#Second)))
  If eingestellteZeit=Date()
    If GetGadgetState(#Check) 
       Shutdown = MessageRequester("Start Shutdown", "Wollen Sie den PC herunterfahren?", #PB_MessageRequester_YesNo)
      If Shutdown
        If Shutdown = #PB_MessageRequester_Yes
            Debug "Siehe bei Else Zeile:64 ;)";EnableShutDown()
            ;ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
        EndIf     
     EndIf
      Else 
        Debug "Der Pc würde nun herunterfahren!";EnableShutDown()
        ;ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
    EndIf
  EndIf
  ProcedureReturn
EndProcedure

;------------------------------------------------------------------- 
      ;Window und Button Events
;------------------------------------------------------------------- 

Repeat
  Select WindowEvent()            
    Case #PB_Event_CloseWindow
       Break       
    Case #PB_Event_Gadget     
      Select EventGadget()
        Case #Close_Window
          Break
        Case #Start_Shutdown                    
          WndProc(hWnd, uMsg, wParam, lParam)
      EndSelect
  EndSelect
            
Until Event = #PB_Event_CloseWindow 
 

Verfasst: 27.10.2008 21:29
von Falko
Ich habe ein ähnliches Problem. Der Rechner startet übers Bios zu einer
vorgegebenen Zeit 5.45Uhr. In der Woche funktioniert das ganze mit der einfachen Shutdownfunktion von ts-soft.
Aber am Wochenende, soll der Rechner überhaupt nicht laufen und ohne, dass eine Anmeldung erfolgt, per Taskplaner ein Shutdown beim
Systemstart ausgeführt werden, welches dann um 6.00Uhr am Wochenende den Rechner herunterfährt.

Leider tut es das nicht, trotz Benutzer-, und Passwortangabe im
Taskmanager. Gibt es dazu einen Lösungsansatz? Ich habe das Gefühl,
das dort keine Windowsanwendungen ausgeführt werden, weil, wenn ich
mich in dieser Zeit von Hand einlogge, der Rechner ordnungsgemäß
herunterfährt.

Shellscripte usw. funktionieren aber, nur kann ich dort keine Windowsevents nutzen.

Hier der von mir zusammengebastelte Source:

Code: Alles auswählen

;- Window Constants
;
;Shutdowntype
#EWX_RESTARTAPPS=40
;Value
#EWX_FORCEIFHUNG=10

Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #Text_1
EndEnumeration
Enumeration
  #Sonntag
  #Montag
  #Dienstag
  #Mittwoch
  #Donnerstag
  #Freitag
  #Samstag
EndEnumeration

Global Font1 = LoadFont(#PB_Any, "Arial"  ,  19, #PB_Font_Bold) 
Global Tag=DayOfWeek(Date())
Global StopTime$="05:59" ; StartZielzeit
Global StopTime1$="06:02"; EndZielzeit
 

Procedure EnableShutDown()
  Protected Privileges.TOKEN_PRIVILEGES
  Protected hToken.l
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure


Procedure.b Open_Window_0()
  If OpenWindow(#Window_0, 548, 133, 360, 90, "Shutdown at 6.00 and Weekend",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
       TextGadget(#Text_0, 40, 10, 300, 60, "Windows wird heruntergefahren",#PB_Text_Center )
       SetGadgetFont(#Text_0, FontID(Font1) )
       TextGadget(#Text_1, 280, 75, 100, 60, "Written by Falko Lünsmann!!")
      ProcedureReturn 1
  EndIf
      ProcedureReturn 0
EndProcedure
 
Procedure WndProc(hWnd, uMsg, wParam, lParam)
  OpenFile(0,"Timer.log")
   FileSeek(0, Lof(0))  
  If uMsg = #WM_TIMER
    time_New$=FormatDate("%hh:%ii",Date())
    WriteStringN(0,time_New$)
    If time_New$ > StopTime$ And time_New$ < StopTime1$ And (Tag=#Samstag Or Tag=#Montag)
       WriteStringN(0,time_New$+"----")
       EnableShutDown()
    Else
       ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE | #EWX_FORCEIFHUNG , 0)
    EndIf
  EndIf
  CloseFile(0)
  ProcedureReturn #PB_ProcessPureBasicEvents
  
EndProcedure
 
If Open_Window_0()
  SetWindowCallback(@WndProc())
  SetTimer_(WindowID(0), 0, 2000, 0)
  While WaitWindowEvent() <> #PB_Event_CloseWindow : 
  Wend
EndIf : End
Die Logfile Zeigt mir an, das es funktionieren müsste, aber der Rechner wird nicht beim Willkommensbildschirm herunter gefahren :freak:

Gruß Falko

Verfasst: 28.10.2008 00:51
von Bisonte
Wird das denn überhaupt ausgeführt ?

Vor dem Willkommensbildschirm lädt er doch keine Programme aus dem Autostart Ordner... oder irre ich mich da ?