![]() |
Betriebsstundenzähler
Hi,
ich würde gerne ein kleines Tool schreiben, was protokolliert, wie viele Stunden ich den Computer habe laufen lassen. Im Prinzip ziemlich simpel: - Programm wird über Autostart gestart, liest die bisherigen Betriebsstunden aus einer Datei - beim Herunterfahren, schreibt das Programm die neuen Betriebsstunden in die Datei Mein Problem ist, dass ich nicht weiß, wie ich auf das Herunterfahren (oder Benutzerabmeldung) reagieren kann... Habe bei DP nur "Hunterfahren ausführen" gefunden... (Vermutlich habe ich fälsche Suchbegriffe benutzt...) Gruß Ben P.S.: Delphi 5 Standard |
Re: Betriebsstundenzähler
|
Re: Betriebsstundenzähler
Hi,
ich würde das per OnCreate und OnClose Ereignis realisieren, beim starten des Prog. wird der bisherige Stand ausgelesen und beim Beenden des Programms wird OnClose ausgelöst auch wenn der user das Prog. nicht selber geschlossen hat sondern Windows beim herunterfahren, dann wird der neue Betriebsstundenzähler- stand gespeichert. Und die Zeit mißt du in dem du beim Start die zeit nimst und beim beenden auch und errechnest daraus die Differenz. siehe SecondsBetween() etc. Das ganze ist in 10 min. gebastelt. mfg TUX |
Re: Betriebsstundenzähler
Hier mein schnell gebastelter Betriebsstundezähler:
- Label1: seit - Label2: ... Mal gestartet - Label3: Betriebsstunden
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var save: TIniFile; begin startTime := now; save := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\save.ini'); Label1.Caption := save.ReadString('Save', 'Since', DateTimeToStr(now)); Label2.Caption := IntToStr(save.ReadInteger('Save', 'Runs', 1)); timeOffset := save.ReadDateTime('Save', 'Time', 0); save.Free; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if not Shutdown then begin if MessageDlg('Wollen Sie das Programm wirklich beenden ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then begin CanClose := False; Exit; end; end; end; //[edit] procedure TForm1.WMENDSESSION(var Msg: TWMQueryEndSession); var save: TIniFile; begin save := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\save.ini'); save.WriteString('Save', 'Since', Label1.Caption); save.WriteInteger('Save', 'Runs',StrToInt(Label2.Caption)+1); save.WriteDateTime('Save', 'Time', timeOffset + now-startTime); save.Free; //[edit] Msg.Result := 1; Shutdown := True; // inherited; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var save: TIniFile; begin save := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\save.ini'); save.WriteString('Save', 'Since', Label1.Caption); save.WriteInteger('Save', 'Runs',StrToInt(Label2.Caption)+1); save.WriteDateTime('Save', 'Time', timeOffset + now-startTime); save.Free; end; function convertTime(time: Extended; dms: String): Integer; begin if dms='d' then result:= Floor(time) else if dms='h' then result:= Floor( (time-Floor(time))*24 ) else if dms='m' then result:= Floor( (time*24-Floor(time*24))*60 ) else if dms='s' then result:= Floor( (time*24*60-Floor(time*24*60))*60 ) else result:=-1; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label3.Caption := IntToStr(convertTime(timeOffset + now-startTime, 'd')) + ' d' + #13#10 + IntToStr(convertTime(timeOffset + now-startTime, 'h')) + ' h' + #13#10 + IntToStr(convertTime(timeOffset + now-startTime, 'm')) + ' m' + #13#10 + IntToStr(convertTime(timeOffset + now-startTime, 's')) + ' s' + #13#10; end; |
Re: Betriebsstundenzähler
Ich habe doch geschrieben WM_ENDSESSION. WM_QUERYENDSESSION wird von Windows gesendet, wenn Windows runtergefahren werden soll. Verneint en programm diese Anfrage, wird Windows nicht runtergefahren. bekommt dein Fenster diese Nachricht jetzt als erstes, speichert es die Zeit ab. Aber Windows fährt ja gar nicht runter. WM_ENDSESSIOn wird von Windows gesendet, wenn kein Fenster Einspruch erhoben hat und Windows tatsächlich runtergefahren wird.
|
Re: Betriebsstundenzähler
Was sucht denn das inherited im Message Handler? :gruebel:
|
Re: Betriebsstundenzähler
Also so?
|
Re: Betriebsstundenzähler
Du reagierst immer noch auf WM_QUERYENDSESSION:
Delphi-Quellcode:
procedure TForm1.WMENDSESSION(var Msg: TWMQueryEndSession);
|
Re: Betriebsstundenzähler
Delphi-Quellcode:
Macht nicht so viel Sinn oder :wink: TMessageWMQueryEndSession ... nimm doch einfach auch TWMEndSession ...
procedure TForm1.WMENDSESSION(var Msg: TWMQueryEndSession);
So hast du ja nur den Message Handler umbenannt, aber nicht die Message neu definiert, auf die du reagieren willst. Florian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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 by Thomas Breitkreuz