![]() |
Bildschirmschoner soll PC herunterfahren
Hallo Leute!
Ich habe ein Problem und zwar bin ich von einem Arbeitskreis unserer Schule gefragt worden ob ich einen Bildschirmschoner erstellen könnte, der den PC herunterfahren kann. Soweit so gut die Funktionen für das herunterfahren etc weiß ich auch und ich habe den Bildschirmschoner auch erstellt, allerdings wird der PC nicht nach der vorgegebenen Zeit heruntergefahren; genauer: er wird gar nicht heruntergefahren wenn er als Logon Screensaver installiert ist. Als normaler Screensaver wird der PC nach der eingestellten Zeit heruntergefahren. Ich habe schon folgende Möglichkeiten ausprobiert gehabt:
Kann mir da vllt jemand sagen, wo der Fehler liegt? Quellcode des eigentlichen Screensavers
Delphi-Quellcode:
Schon mal vielen Dank!
procedure TSaverForm.FormShow(Sender: TObject);
begin inc(n); if n=1 then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1); end; st := time; end; procedure TSaverForm.Timer1Timer(Sender: TObject); var Ini : TIniFile; h, m, s, ms: word; timerh, timerm : string; Registry: TRegistry; begin { try Ini:=TIniFile.Create(GetProgramPath + '\Umwelt Schoner\settings.ini'); shutdown := Ini.ReadInteger('POWERSTAT','SHUTDOWN',0); ruhezustand := Ini.ReadInteger('POWERSTAT','RUHEZUSTAND',0); standby := Ini.ReadInteger('POWERSTAT','STANDBY',0); timerh := Ini.ReadString('Settings','Timerh','Wert'); timerm := Ini.ReadString('Settings','Timerm','Wert'); finally Ini.Free; end; } with TRegistry.Create do begin try Rootkey:=HKEY_LOCAL_MACHINE; if OpenKey('Software\E.T.-IT Solutions\Umwelt-Schoner\Screen Saver.UmweltSchoner',True) then begin timerh:=ReadString('Timerh'); timerm:=ReadString('Timerm'); shutdown:=ReadInteger('Shutdown'); ruhezustand:=ReadInteger('Ruhezustand'); standby:=ReadInteger('StandBy'); end; finally Free; end; end; Timer := timerh + ':' + timerm + ':00'; ct := time; DecodeTime(ct-st, h, m, s, ms); at := TimeToStr(EncodeTime(h,m,s,ms)); if at = timer then begin //Herunterfahren if shutdown = 1 then begin ExWindows(EWX_Shutdown OR EWX_FORCEIFHUNG OR EWX_Poweroff); end; //Ruhezustand if ruhezustand = 1 then begin ShellExecute(Application.Handle, 'open', 'rundll32.exe', 'powrprof.dll,SetSuspendState', nil, SW_SHOWNORMAL); application.Terminate; end; //Stand-By if standby = 1 then begin end; end; end; |
Re: Bildschirmschoner soll PC herunterfahren
könnte sein, daß da irgendwas nicht die nötigen Rechte hat, irgendwas in dieser Richtung zu machen.
du könntest di ja mal in einer LogFile, oder da das SS eh auf'm Bildschirm dargestellt wird z.B. in einem Memo, den aktuellen Status ausgeben lassen. also Zitat:
|
Re: Bildschirmschoner soll PC herunterfahren
Warum packst du so viel Code in den Timer?
Du kannst dir doch beim Start die aktuelle Uhrzeit merken, die Inidatei/Registry auslesen und die Uhrzeit ausrechnen, wann der Rechner runterfahren soll. Im Timer fragst du nur noch ab, ob die aktuelle Zeit >= als die Runterfahrzeit ist. Wozu du jeweils die Zeiten in Strings wandelst, ist mir auch nicht klar. |
Re: Bildschirmschoner soll PC herunterfahren
Wie sieht ExWindows aus?
|
Re: Bildschirmschoner soll PC herunterfahren
Okay schon mal vielen dank für die Hinweise...
werde mal versuchen die umzusetzen. Soviel Code ist gut wenn der Bildschirm ausgeschaltet wird und der PC heruntergefahren wird. @ Luckie: Was ist mit ExWindows....??? |
Re: Bildschirmschoner soll PC herunterfahren
Zitat:
MfG, Bug |
Re: Bildschirmschoner soll PC herunterfahren
Posting korririgiert. Jetzt sollte es verständlich sein.
|
Re: Bildschirmschoner soll PC herunterfahren
Achso.... okay gut...!
Die Funktion ExWindows sieht bei mir folgendermaßen aus:
Delphi-Quellcode:
als Angemeldeter Benutzer funktioniert das auch ;) aber wie gesagt wenn keiner angemeldt ist nicht.
function ExWindows(const AFlag: Word): Boolean;
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord; begin result:= false; vi.dwOSVersionInfoSize:=SizeOf(vi); if GetVersionEx(vi) then begin if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then begin // Windows NT if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then begin LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^, h); CloseHandle(hToken); result := ExitWindowsEx(Aflag, 0); end; end else begin // Windows 95 Result := ExitWindowsEx(Aflag, 0); end; end; end; |
Re: Bildschirmschoner soll PC herunterfahren
Hat der Dienst eventuell das Privileg "SeShutdownPrivilege" nicht? Schreib mal eine Logdatei und guck, ob die Funktion korrekt ausgeführt wird.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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