![]() |
Shutdown nach bestimmter Zeit
Hallo!
Ich verwende folgenden Code, um den PC herunter zu fahren:
Delphi-Quellcode:
Wo/wie kann ich festlegen, dass der PC erst nach z.b. 1 Minute herunterfahren wird?
function ExWindows(const AFlag: Word): Boolean;
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord; begin flag:= EWX_Shutdown; result:= false; vi.dwOSVersionInfoSize:=SizeOf(vi); if GetVersionEx(vi) then begin if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then begin // Windows NT // Achtung bei Delphi 2 muß @hToken stehen ... 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; Vielen Dank Markus |
Re: Shutdown nach bestimmter Zeit
ruf doch einfach die shutdown.exe (param "-s" für herunterfahren) in C:\Windows\System32 auf und übergebe ihr den Parameter "-t 60"...
oder willst du unbedingt den Code da benutzen? |
Re: Shutdown nach bestimmter Zeit
Zitat:
Danke für die superschnelle Antwort. Dein Vorschlag klingt interessant. Kannst du mir erklären, wie ich vorgehen muss? Ich hab nicht gewusst, dass man überhaupt auf die shutdown.exe zugreifen kann... Wichtig ist, dass das ganze in Delphi passiert. |
Re: Shutdown nach bestimmter Zeit
Zitat:
|
Re: Shutdown nach bestimmter Zeit
Das Problem ist doch, dass man sich unter NT-Systemen erstmal die Rechte beschaffen muss.
Es wird doch nicht einfach reichen, die shutdown.exe über eine Delphi-Funktion aufzurufen oder? Kann man mit dem Code, den ich oben angegeben habe, keine Zeit vergeben? |
Re: Shutdown nach bestimmter Zeit
Hallo!!!
Das ganze ist wirklich ganz einfach zu programmieren und noch zu erweitern (z.B. zu einer bestimmten Uhrzeit herunterfahren...) wenn Du folgendes macht (und bei DEINEM Code oben bleibst): Hier mal ein Pseudocode (Unit DateUtils einbinden):
Delphi-Quellcode:
... zumindest so ähnlich, mal als Denkanstoß. Habe vor einigen Wochen ein selbiges Programm geschrieben, leider schon wieder gelöscht, sonst könnte ich Dir den Source posten.
ShutDownDateTime : TDateTime;
[...] ShutDownDateTime := AddMinutes(StrToInt(EditShutDownAfterXMinutes.Text), Now); [...] procedure Timer1OnTimer(Sender : TObject); Begin If Now >= ShutDownDateTime Then Begin; // Hier Windows herunterfahren oder was auch immer... End; End; [...] SCRaT |
Re: Shutdown nach bestimmter Zeit
Der Aufruf der shutdown.exe würde dann folgendermaßen funktionieren?:
Delphi-Quellcode:
uses ShellAPI;
ShellExecute(Handle, 'open', PChar(C:\Windows\System32\shutdown.exe -s -m \\Rechnername -t %STime% -c "Herunterfahren des PCs" ), nil, nil, sw_Show); |
Re: Shutdown nach bestimmter Zeit
Zitat:
Wenn jemand ein ähnliches Programm mit Code hat, dann würd ich mich darüber freuen :-D Oder soll ich doch die Idee mit der shutdown.exe machen? Markus |
Re: Shutdown nach bestimmter Zeit
Zitat:
|
Re: Shutdown nach bestimmter Zeit
Dann wärs schön, wenn mir jemand scrat1979's Vorschlag nochmal genauer erklären könnte.
Danke :roteyes: |
Re: Shutdown nach bestimmter Zeit
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DateUtils, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Timer1: TTimer; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; ShutDownDateTime : TDateTime; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ShutDownDateTime := IncMinute(now, StrToInt(Edit1.Text)); Label2.Caption := 'Shutdown DateTime: ' + DateTimeToStr(ShutDownDateTime); Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label3.Caption := Format('ShutDown in %d Sekunden...', [SecondsBetween(now, ShutDownDateTime)]); if now >= ShutDownDateTime then Begin // "=" würde nicht reichen, der Timer wird ja nicht EXAKT am Endzeitpunkt ausgelöst, also auch auf Zeit später reagieren. Timer1.Enabled := False; // Nicht vergessen!!!!!!!!!!!!!!!!!!!! Label3.Caption := 'FERTIG!!!'; showmessage('Hier was machen...'); End; end; end. |
Re: Shutdown nach bestimmter Zeit
Vielen Dank scrat1979. Dein Programm hat mir wirklich weiterhelfen können. :-D
|
Re: Shutdown nach bestimmter Zeit
Noch eine Frage zu dem Thema. Man hat mir gesagt, dass ich das ganze auch mit sleep() lösen kann.
Das hat auch geklappt. Meine Frage ist, welche Methode jetzt "eleganter" bzw. sinnvoller ist? |
Re: Shutdown nach bestimmter Zeit
Zitat:
1. Schau mal die Prozessor-Auslastung während Sleep an (mehr?) 2. Wird WÄHREND dem Sleep das Programm (die Message-Queue) fortgesetzt? (Würde glaub dem Sinn von Sleep wiedersprechen). D.h. man würde während dem "Countdown" das PRogramm einfrieren. Irgend etwas sagt mir aber, daß die Sleep()-Lösung unsauber ist. Da müssten mal die Cracks eine Begründung liefern oder mir widersprechen... SCRaT |
Re: Shutdown nach bestimmter Zeit
Zitat:
Prozessorauslastung ist bei mir so gering, dass ich nicht sagen kann, was in dieser Hinsicht besser ist Zitat:
Zitat:
|
Re: Shutdown nach bestimmter Zeit
Hmmm, also ich denke der große "Nachteil" des Sleep in diesem Fall ist wohl das einfrieren des Programmes, d.h. es kann nicht mehr auf Nachrichten (Mausklicks etc.) reagieren...
SCRaT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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