Herunterfahren
Die Funktion zum Herunterfahren:
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
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
Result := ExitWindowsEx(Aflag, 0);
end;
end;
end;
// Aufruf
ExWindows(EWX_Poweroff
OR EWX_FORCE);
EWX_Force ist wichtig, damit laufende Programme beendet werden. Es sollte aber noch eine Minute davor darauf hingewiesen werden.
Verweigerung der Anmeldung
Außerdem sollte das Programm ja beim Windows-Start geladen werden, also kann schon bei onFormCreate die Zeit überprüft werden, und wenn sie überschritten wurde, der Shutdown eingeleitet werden.
Unsichtbar
Code, damit man das Programm nicht sieht:
Application.ShowMainForm := false; //in FormCreate
Dann würde ich aber den Einsatz eines tray-Icons empfehlen(CoolTrayIcon, JvTrayIcon von den Jedis oder
Tray-Icon)
Zeit
Die Zeit würde ich als TTime nehmen, sofern es sich um eine feste Uhrzeit handelt.
Delphi-Quellcode:
procedure TForm.Timer1Timer(Sender: TObject); // Interval = 60000 (=1 Minute)
begin
if (Time = StrToTime('20:00:00')) then
begin
...
end;
end;
Oder soll es die Zeit sein, seit der der Rechner läuft?
Dann würde ich es so machen:
Delphi-Quellcode:
var Uptime : Cardinal;
procedure TForm.Timer1Timer(Sender: TObject); // Interval = 60000 (=1 Minute)
begin
case Uptime of
59: Showmessage('Noch eine Minute!');
60: ExWindows(...);
else: Inc(Uptime);
end;
end;
Um ein erneutes Hochfahren in diesem Fall zu verhindern, könntest du den Tag des letzten Ausführens in einer INI-Datei speichern.Auf
DSDT.Info gibt es ein gutes INI-Tutorial.
Delphi-Quellcode:
// FormCreate
if (StrToDate(INI.ReadString('Datum', 'LetzterStart', '01.01.2000') = Now) then
begin
Showmessage('Heute wurde schon einmal gestartet!');
ExWindows(...);
end
else
INI.WriteString(DateToStr(Now));
Das dürfte fürs Erste reichen.
Gruß,
ManuMF