Realisierung Programm wurde gewisse Zeit nicht bedient ?
Hallo,
Delphi 7 Wie kann man in einem Delphi-Programm realisieren, dass ein Programm vom Benutzer x-Stunden nicht benutzt(bedient) wurde ? Zeit sollte einstellbar sein , nach dieser Zeit der "Ruhe" sollte ein Ereignis ausgelöst werden. Danke. Gruss |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
Das kommt darauf an, wie man "nicht benutzen/bedient" für die Anwendung definiert
Schau dir mal TApplicationEvents an, das feuert viele Events, anhand derer man das festmachen könnte. Das IdleEvent kommt dann von einem Timer der auf der MainForm liegt (z.B. IdleTimer) mit dem gewünschten Intervall (z.B. 60000ms) Den Timer bei einer Aktion so zurücksetzen:
Delphi-Quellcode:
Wenn das mit den ApplicationEvents nichts bringt, dann musst du bei jeder Aktion die du als "der Benutzer arbeitet mit meiner Anwendung" den Timer zurücksetzen.
IdleTimer.Enabled := False;
IdleTimer.Enabled := True; |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
Es gibt zwei grudsätliche Möglichkeiten
- Du startest einen Timer mit dem "Timeout" und immer wenn der Benutzter was macht (bediehnt) startest du diesen Timer neu (Enable auf False und wieder auf True). ist die Zeit abgelaufen löst der Timer nun seine Ereignismethode aus. - Immer wenn der Benutzer etas macht, wird eine Variable auf die aktuelle Zeit gesetzt und nebenbei läuft ein Timer Timer (z.B. mit einem Minutenintervall), worin wird die Zeit der letzen Bediehnung mit der aktuellen Zeit verglichen wird. Ist die Zeit abgelaufen (Differentz groß genug, dann löst du das Ereignis aus. |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
eine elegante Version wurde hier vor einiger Zeit gepostet.
Delphi-Quellcode:
function LastInput: DWord;
var LInput: TLastInputInfo; begin LInput.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(LInput); Result := GetTickCount - LInput.dwTime; end; procedure TForm2.Timer1Timer(Sender: TObject); begin Caption := IntToStr(LastInput); end; |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
GetLastInputInfo gibt an, wann zuletzt Benutzereingaben im Windows eingingen.
Wenn man nun in einem anderem Programm was macht, dann wird das ja auch mitgezählt, wärend das eigene Programm schon seit Tagen untätig sein könnte. Aber vielleicht reicht das ihm ja aus. |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
Eine weitere Möglichkeit (nicht ausführlich getestet):
Delphi-Quellcode:
Ob das nun so schlau ist, sich ins OnMessage-Event einzuklinken ... ka :-D
var
LastInputTime: DWord; procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin Case Msg.Message of WM_KEYFIRST..WM_KEYLAST, WM_MOUSEFIRST..WM_MOUSELAST: If Msg.Message <> WM_MOUSEMOVE then LastInputTime := GetTickCount; end; end; |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
@himitsu
berechtigter Einwand, lässt sich aber berücksichtigen:
Delphi-Quellcode:
public
{ Public-Deklarationen } FIdle:Dword; FLTC:Cardinal; end; var Form2: TForm2; implementation {$R *.dfm} function TForm2.LastInput: DWord; var LInput: TLastInputInfo; tc:Cardinal; begin LInput.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(LInput); tc := GetTickCount; if FLTC=0 then FLTC := getTickCount; if Application.Active then FIdle := tc - LInput.dwTime else begin FIdle := FIdle + TC - FLTC ; end; FLTC := TC; Result := FIdle; end; procedure TForm2.Timer1Timer(Sender: TObject); begin Caption := intToStr(LastInput); end; |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
Es gibt echt noch Leute die GetTickCount benutzen ohne sich der Tatsache bewußt zu sein daß Windowssysteme immer länger laufen und immer zuverlässiger werden? :shock:
|
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
hi, lasst den TE doch erst mal auf die vielen Angebote antworten :wink:
Noch weiss ja keiner so richtig wie er dies meint? Zitat:
Zumal sich ja hier auch die Frage aufwirft, das man eigtl wissen sollte, was man auf seinem Rechner noch alles selber gestartet hatt. Und wenn ich was anderes machen soll/muss, ich alles beende wenn ich den Platzt verlasse. Da nützt mir auch nicht, das mir (m)ein Prog mitteilt, das ich x Stunden nix mehr am Prog/Rechner gemacht habe oder sogar den Rechner runterfährt(Datenverlust mit eingeschlossen :pale:) Nur weil was auch immer mich daran hindern sollte, Programme die ich nicht mehr brauche auch zu beenden :stupid: Gruss alfold |
AW: Realisierung Programm wurde gewisse Zeit nicht bedient ?
Übrigens, ist WM_ENTERIDLE nicht auch ein gangbarer Weg? Könnte auch über einen Hook für andere Fenster abgefangen werden ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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