Thema: Delphi Sperrprogramm

Einzelnen Beitrag anzeigen

Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#2

Re: Sperrprogramm

  Alt 2. Jan 2006, 11:36
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 Hier im Forum suchenTray-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
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat