Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bildschirmschoner soll PC herunterfahren (https://www.delphipraxis.net/128967-bildschirmschoner-soll-pc-herunterfahren.html)

T.E. 10. Feb 2009 12:02


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:
  • Auslesen der Zeit aus der Registry
  • Auslesen der Zeit aus einer ini
  • Vorgabe der Zeit im Quellcode
Alles drei gab nicht das gewünschte Ergebniss.
Kann mir da vllt jemand sagen, wo der Fehler liegt?

Quellcode des eigentlichen Screensavers
Delphi-Quellcode:
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;
Schon mal vielen Dank!

himitsu 10. Feb 2009 12:20

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:

{uhrzeit}: programm gestartet
{uhrzeit}: Timeoutwert ausgelesen und dieser ist {zeit}
{uhrzeit}: ShutDown wir eingelaitet
{uhrzeit}: powrprof.dll wurde ausgeführt und der Rückgabewert war {wert}
...

Zoot 10. Feb 2009 12:41

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.

Luckie 10. Feb 2009 12:48

Re: Bildschirmschoner soll PC herunterfahren
 
Wie sieht ExWindows aus?

T.E. 10. Feb 2009 13:12

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....???

BUG 10. Feb 2009 13:51

Re: Bildschirmschoner soll PC herunterfahren
 
Zitat:

Zitat von T.E.
@ Luckie: Was ist mit ExWindows....???

Warscheinlich meint er: "Wie sieht ExWindows aus?" und möchte wissen was die Funktion macht bzw. wo sie herkommt bzw. ob du den Quellcode posten würdest, damit man dir besser helfen kann :stupid:

MfG,
Bug

Luckie 10. Feb 2009 17:13

Re: Bildschirmschoner soll PC herunterfahren
 
Posting korririgiert. Jetzt sollte es verständlich sein.

T.E. 11. Feb 2009 12:11

Re: Bildschirmschoner soll PC herunterfahren
 
Achso.... okay gut...!
Die Funktion ExWindows sieht bei mir folgendermaßen aus:
Delphi-Quellcode:
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;
als Angemeldeter Benutzer funktioniert das auch ;) aber wie gesagt wenn keiner angemeldt ist nicht.

Luckie 11. Feb 2009 13:22

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 05:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz