![]() |
Wake up (wo liegt der Fehler???)
Hallöle,
ich will gern ein kleines Tool erstellen welches meinen PC zu ner bestimmten vorgegebenen Zeit runter fährt und auch wieder zu ner bestimmten Zeit Hochfährt. Zur Zeit benutze ich das Prog von Databecker (PC Zeitschaltuhr) aber ich will diese Funktion in mein Programm gern einbinden und auf zusätzliche Programme verzichten. Derzeit verwende ich folgenden Code. Das runterfahren in den Ruhezustand funzt, nur schaltet der sich gleich wieder ein nachdem er aus ist und ni zu der Zeit die ich Vorgebe (täglich). Worin liegt da der Fehler?
Delphi-Quellcode:
Über ne Hilfe wäre ich dankbar und ni wundern habe das für Testzwecke erstmal als Buttonklick erstellt.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Timer1: TTimer; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private hTimer:THandle; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} {function SetSuspendState( Hibernate: Boolean, ForceCritical: Boolean, DisableWakeEvent: Boolean); { Parameters: Hibernate: If this parameter is TRUE, the system hibernates. If the parameter is FALSE, the system is suspended. ForceCritical: If this parameter is TRUE, the system suspends operation immediately; if it is FALSE, the system broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation. DisableWakeEvent: If this parameter is TRUE, the system disables all wake events. If the parameter is FALSE, any system wake events remain enabled. Windows NT/2000/XP: Included in Windows 2000 and later. Windows 95/98/Me: Included in Windows 98 and later.} var _SetSuspendState: function (Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL stdcall = nil; function LinkAPI(const module, functionname: string): Pointer; forward; function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; begin if not Assigned(_SetSuspendState) then @_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState'); if Assigned(_SetSuspendState) then Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent) else Result := False; end; function LinkAPI(const module, functionname: string): Pointer; var hLib: HMODULE; begin hLib := GetModulehandle(PChar(module)); if hLib = 0 then hLib := LoadLibrary(PChar(module)); if hLib <> 0 then Result := getProcAddress(hLib, PChar(functionname)) else Result := nil; end; procedure TForm1.Button2Click(Sender: TObject); begin SetSuspendState(False, True, False); end; procedure TForm1.Button3Click(Sender: TObject); begin SetSuspendState(False, False, True); end; procedure TForm1.Button1Click(Sender: TObject); var liDuTime:LARGE_INTEGER; weckzeit,uhrzeit:SYSTEMTIME; ftime:FILETIME; fitime:FILETIME; begin weckzeit.wYear:=0; weckzeit.wMonth:=0; weckzeit.wDayOfWeek:=0; weckzeit.wDay:=0; weckzeit.wHour:=StrToInt(Edit1.Text); weckzeit.wMinute:=StrToInt(Edit2.Text); weckzeit.wSecond:=0; weckzeit.wMilliseconds:=0; SystemTimeToFileTime(weckzeit,ftime); LocalFileTimeToFileTime(ftime,fitime); liDuTime.LowPart:=fitime.dwLowDateTime; liDuTime.HighPart:=fitime.dwHighDateTime; hTimer:=CreateWaitableTimer(NIL,TRUE,NIL); CancelWaitableTimer(htimer); SetWaitableTimer(hTimer,lidutime.quadpart,1000,NIL,NIL,true); SetSuspendState(true,False,false); end; //begin //SetSuspendState(True, False, False); //end; procedure TForm1.FormCreate(Sender: TObject); begin end; end. LG Mario |
Re: Wake up (wo liegt der Fehler???)
In der Doku steht, daß positive Werte für dueTime als absolute UTC Zeit interpretiert wird. Das alleine erklärt schon das sofortige Aufwachen. Also entweder den Zeitpunkt als UTC ermitteln oder die relative Zeit als negativen Wert angeben.
Weiterhin irritiert die period von 1000 ms. Sollte da nicht besser eine 0 stehen? Oder soll der Timer jede Sekunde auslösen? |
Re: Wake up (wo liegt der Fehler???)
Ok den Timer kann man auch auf 0 setzen, darin sehe ich ni das Problem.
Aber wie erstelle ich die Positiven Werte oder die Relativen als negativen wert? Habe da gerade mal keinen schimmer davon. Lg Mario |
Re: Wake up (wo liegt der Fehler???)
Zitat:
Delphi-Quellcode:
lidutime.quadpart := -lidutime.quadpart
|
Re: Wake up (wo liegt der Fehler???)
ich komme da echt ni so mit. habe es auch mal versucht umzustellen wie du es angegeben hast aber es startet immer noch wieder neu nachdem der Rechner ausgegangen war.
|
Re: Wake up (wo liegt der Fehler???)
Zitat:
|
Re: Wake up (wo liegt der Fehler???)
irgendwo liegt der Fehler nur weiß ich ni wo.
Hat jemand hir im Forum schonmal sowas programmiert und kann mir helfen????????? Lg Mario |
Re: Wake up (wo liegt der Fehler???)
Der Taskscheduler erwartet ein File mit der Endung .job im Verzeichnis Tasks (z.b. C:\WINDOWS\Tasks).
Schau mal hier rein: ![]() (in TaskSched.pas: uses Variants hinzufügen) |
Re: Wake up (wo liegt der Fehler???)
Den Taskscheduler hab ich schonmal gelesen. Habe doch oben geschrieben das ich gern mein Programm erweitern will und genzlich auf zusätzliche Programme verzichten will.
Zur History... Ich habe ein Programm geschrieben welches für meine Terrarien ist, sprich es steuert ein USB-Interface mit angeschlossenen Relais. Diese Relais sind eigentlich schon der Ersatz gegenüber der herkömmlichen Zeitschaltuhren und die Steuerung läuft über den Laptop. Da der Laptop 24h an ist wollte ich das Programm um die Funktion Wakeup erweitern, so das nach dem letzten Ausschalten einer Lampe auch der Laptop in den Ruhemodus fährt und abschaltet sowie früh zu einer bestimmten Zeit wieder hoch fährt. Sollte einer auf die Idee kommen das ich es übers Bios machen soll, hab ich schon versucht nur habe ich im Bios keine sichtbaren Einstellmöglichkeiten gefunden um es einzutragen (Medion akoya). Laut Hersteller unterstützt das Board die Funktion aber es gibt kein Bios-update. Hier nochmal der Codeschnipsel welchen ich aus dem Netz habe. Das Runterfahren in den Ruhemodus funktioniert. Aufgrund warscheinlich falscher Übergabewerte oder fehlenden Daten startet er aber gleich wieder neu. Somit funzt ni das mit dem Wecken und automatisch starten aus den Ruhemodus zu einer vorgegeben Zeit.
Delphi-Quellcode:
wenn mir jemand helfen kann den Fehler zu finden, oder einen eigenen Code hat der funktioniert wäre ich dankbar darüber.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Timer1: TTimer; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); private hTimer:THandle; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} {function SetSuspendState( Hibernate: Boolean, ForceCritical: Boolean, DisableWakeEvent: Boolean); { Parameters: Hibernate: If this parameter is TRUE, the system hibernates. If the parameter is FALSE, the system is suspended. ForceCritical: If this parameter is TRUE, the system suspends operation immediately; if it is FALSE, the system broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation. DisableWakeEvent: If this parameter is TRUE, the system disables all wake events. If the parameter is FALSE, any system wake events remain enabled. Windows NT/2000/XP: Included in Windows 2000 and later. Windows 95/98/Me: Included in Windows 98 and later.} var _SetSuspendState: function (Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL stdcall = nil; function LinkAPI(const module, functionname: string): Pointer; forward; function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; begin if not Assigned(_SetSuspendState) then @_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState'); if Assigned(_SetSuspendState) then Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent) else Result := False; end; function LinkAPI(const module, functionname: string): Pointer; var hLib: HMODULE; begin hLib := GetModulehandle(PChar(module)); if hLib = 0 then hLib := LoadLibrary(PChar(module)); if hLib <> 0 then Result := getProcAddress(hLib, PChar(functionname)) else Result := nil; end; procedure TForm1.Button2Click(Sender: TObject); begin SetSuspendState(False, True, False); end; procedure TForm1.Button3Click(Sender: TObject); begin SetSuspendState(False, False, True); end; procedure TForm1.Button1Click(Sender: TObject); var liDuTime:LARGE_INTEGER; weckzeit,uhrzeit:SYSTEMTIME; ftime:FILETIME; fitime:FILETIME; begin weckzeit.wYear:=0; weckzeit.wMonth:=0; weckzeit.wDayOfWeek:=0; weckzeit.wDay:=0; weckzeit.wHour:=StrtoInt(Edit1.Text); weckzeit.wMinute:=StrToInt(Edit2.Text); weckzeit.wSecond:=0; weckzeit.wMilliseconds:=0; SystemTimeToFileTime(weckzeit,ftime); LocalFileTimeToFileTime(ftime,fitime); liDuTime.LowPart:=fitime.dwLowDateTime; liDuTime.HighPart:=fitime.dwHighDateTime; hTimer:=CreateWaitableTimer(NIL,true,NIL); CancelWaitableTimer(htimer); SetWaitableTimer(hTimer,lidutime.quadpart,0,NIL,NIL,true); SetSuspendState(true,False,false); end; //begin //SetSuspendState(True, False, False); //end; end. Lg Mario |
Re: Wake up (wo liegt der Fehler???)
Liste der Anhänge anzeigen (Anzahl: 1)
Dieser Code funktioniert:
(Hibernate muss natürlich aktiviert sein.)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Edit6: TEdit; Label6: TLabel; Label7: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } hTimer: THandle; public { Public-Deklarationen } end; var Form1: TForm1; _SetSuspendState: function (Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL stdcall; implementation {$R *.dfm} function LinkAPI(const module, functionname: string): Pointer; var hLib: HMODULE; begin hLib := GetModulehandle(PChar(module)); if hLib = 0 then hLib := LoadLibrary(PChar(module)); if hLib <> 0 then Result := getProcAddress(hLib, PChar(functionname)) else Result := nil; end; function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; begin if not Assigned(_SetSuspendState) then @_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState'); if Assigned(_SetSuspendState) then Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent) else Result := False; end; procedure TForm1.Button1Click(Sender: TObject); var liDuTime:LARGE_INTEGER; weckzeit:SYSTEMTIME; ftime:FILETIME; fitime:FILETIME; begin weckzeit.wYear:=strtoint(edit1.text); weckzeit.wMonth:=strtoint(edit2.text); weckzeit.wDayOfWeek:=strtoint(edit4.text); weckzeit.wDay:=strtoint(edit3.text); weckzeit.wHour:=strtoint(edit5.text); weckzeit.wMinute:=strtoint(edit6.text); weckzeit.wSecond:=0; weckzeit.wMilliseconds:=0; SystemTimeToFileTime(weckzeit,ftime); LocalFileTimeToFileTime(ftime,fitime); liDuTime.LowPart:=fitime.dwLowDateTime; liDuTime.HighPart:=fitime.dwHighDateTime; hTimer:=CreateWaitableTimer(NIL,TRUE,NIL); CancelWaitableTimer(htimer); SetWaitableTimer(hTimer,lidutime.quadpart,1000,NIL,NIL,true); SetSuspendState(true,true,false); end; procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='2009'; Edit2.text:='11'; Edit3.text:='5'; Edit4.text:='4'; Edit5.text:='20'; Edit6.text:='55'; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz