Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Logout nach Zeit (https://www.delphipraxis.net/120513-logout-nach-zeit.html)

BigAl 11. Sep 2008 22:14


Logout nach Zeit
 
Hallo zusammen,

ich habe eine Applikation geschrieben in der sich Benutzer einloggen können. Nun möchte ich eine zentrale Funktion schreiben, welche den aktuellen benutzer nach einer bestimmten Zeit ausloggt. Die Zeit soll aber nur laufen, wenn der Benutzer nichts macht (keine Taste auf Tastatur und Maus drückt). Soweit so gut.

Das problem ist nun, das meine Applikation aus einem Hauptformular besteht welches den Container darstellt. Dieses Formular hat einen Kopf- und einen Fussbereich. Dazwischen habe ich TPanel, welches ich als Canvas für die dynamische Aufnahme meiner Forms benutze. Das Hauptproblem ist nun, dass ich nie weiss, wo meine Events nun landen. Beim Hauptformular, beim eingebetteten Formular oder gar bei einem geöffneten Dialog. Ich habe schon verzweifelt im Application-Objekt usw. gesucht. OnIdle fällt leider flach, da jeder kleinste Zucker der Maus oder halt auch irgendwelche Timer die ich laufen habe jeweils nach Abschluss wieder die OnIdle kurz aufrufen.

Zurück zum Problem. Wie kann ich Applikationsweit feststellen, ob eine Taste der Tastatur oder eine Taste der Maus betätigt wurde. Der Ablauf des Programms soll dann natürich normal fotgesetzt werden. Ich möchte ja lediglich die Timout-Zeit neu starten...

Hat irgendwer 'ne Idee bzw. hat irgendjemand verstanden was ich oben geschrieben habe :?: :? :?:

Alex

BigAl 11. Sep 2008 22:53

Re: Logout nach Zeit
 
Leider kann ich den Beitrag nicht löschen. Mache mir seit Tagen Gedanken und die Lösung ist so einfach. Wäre evtl. was für die Code-Library:

1. Application.OnMessage zuweisen (z.B. durch setzen von TApplicationEvents auf dem Hauptformuar.
2. folgenden Code einfügen:

Delphi-Quellcode:
 if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_LBUTTONDOWN) or <irgendwelche weiteren Ereignisse>) then
    <timeout neu initialiseren>
Regards

Alex

Mackhack 12. Sep 2008 00:55

Re: Logout nach Zeit
 
[msdn]
GetLastInputInfo
[/msdn]

toms 12. Sep 2008 06:27

Re: Logout nach Zeit
 
Zitat:

Zitat von Mackhack
[msdn]
GetLastInputInfo
[/msdn]

Hallo, GetLastInputInfo() funktioniert systemweit. Die Frage war jedoch
Zitat:

Wie kann ich Applikationsweit feststellen, ob eine Taste der Tastatur oder eine Taste der Maus betätigt wurde.

Mackhack 12. Sep 2008 06:30

Re: Logout nach Zeit
 
Ups!

Sherlock 12. Sep 2008 07:29

Re: Logout nach Zeit
 
Ich würde nur WM_KEYDOWN und WM_MOUSEMOVE prüfen, jede Mausaktion eines typischen grobmotorischen Users ist zwangsläufig mit einer Mousebewegung verbunden ;)

Sherlock

Jelly 12. Sep 2008 11:01

Re: Logout nach Zeit
 
Bei MouseMove passiert aber dann auch ein Reset des Timers wenn der Benutzer lediglich die Maus über die Form bewegt ohne zu klicken. Das nenne ich noch nicht wirklich "aktiv" mit der Anwendungen arbeiten.

BigAl 12. Sep 2008 11:15

Re: Logout nach Zeit
 
Hallo Leute,

vielen Dank für eure Antworten.

Das mit der Lösung über den Message-Handler funktioniert prächtig :-D . Ich setze mir einfach einen Zeitstempel der letzten Benutzeraktion und kann dann über die Zeitdifferenz zur aktuellen Zeit wunderbar den Timeout-Wert ermitteln. Nach der Zeit mache ich dann einen "Fallback" auf den Default-User.

Ein bisserl am grübeln bin ich noch was ich mache wenn der Benutzer in einem Dialog (Modal) steht. Am einfachsten wäre es - denke ich - solange WM_CLOSE-Messages zu schicken bis alle Dialoge geschlossen sind. Natürlich muss zwischen dem Senden der Messages die Kontrolle immer wieder an die Applikation gegeben werden, damit die Fenster auch geschlossen werden. Da ich die Überprüfung eh einem zentralen Timer vornehme könnte das dann wie folgt aussehen:

OnTimer:
if <...Timeout...> then
if <Dialog geöffnet> then
SendMessage(AppHandle, WM_CLOSE....)
else
<Logout>

Wie sieht das für euch aus? Hat jemand eine elegantere Lösung parat?

Regards

Alex

guidok 12. Sep 2008 11:34

Re: Logout nach Zeit
 
Ich habe keine elegantere Lösung, aber ich stelle mir gerade vor, mit deinem Programm zu arbeiten, irgendwelche Daten eingebe oder bearbeite, kurz auf die Toilette muss, dabei vielleicht jemanden treffe und einen Plausch (natürlich dienstlich) halte, zurück komme und feststellen muss, dass meine bisherige Arbeit für die Katz war, weil mich das Programm abgemeldet hat.

Edit:

Vielleicht sollte nach dem Timeout einfach die weitere Bedienung, bis zur Erneuten Anmeldung, gesperrt werden. A la Passwort-Bildschirmschoner.

Sherlock 12. Sep 2008 11:37

Re: Logout nach Zeit
 
Zitat:

Zitat von Jelly
Bei MouseMove passiert aber dann auch ein Reset des Timers wenn der Benutzer lediglich die Maus über die Form bewegt ohne zu klicken. Das nenne ich noch nicht wirklich "aktiv" mit der Anwendungen arbeiten.

Microsoft schon ;) So funktionieren halt Bildschirmschoner, oder das Sperren eines Arbeitsplatzes.

Sherlock

Jelly 12. Sep 2008 12:41

Re: Logout nach Zeit
 
Zitat:

Zitat von Sherlock
Microsoft schon ;) So funktionieren halt Bildschirmschoner, oder das Sperren eines Arbeitsplatzes.

Da sieht man mal was die unter Arbeit verstehen :mrgreen:

Zum Problem mit den modal Dialogen:
Ich hatte dasselbe Problem mal in einer .NET Anwendung unter Visual Studio. Meine Lösung bestand darin, alle Forms deiner Anwendung von einer Basisform abzuleiten, und den Konstructor und Destructor zu überschreiben. Bei jedem Create knallst du die Form in eine zentrale ObjectList rein, bei jedem Destroy schmeisst du sie wieder raus. Die List hat den Vorteil, dass sie, wenn sie von hinten nach vorn durchgearbeitet wird, dir die richtige Schliess-Reihenfolge der Fenster gibt.

Tritt jetzt also ein Timeout ein, so schliesse einfach alle Fenster aus der Liste im Application Event. Vergiss aber nicht zu überprüfen, ob das Close funktioniert, denn es kann unter gewissen Umständen nämlich fehlschlagen, z.B. wenn eine MessageBox grad noch geöffnet ist.

Ich bin damals sogar noch einen Schritt weiter gegangen. Statt über ein normales Close zu schliessen, habe ich eine virtuelle Methode ForceClose in der Basisform implementiert, die dann bei Bedarf noch in jeder Childform überschrieben werden kann, und eventuell noch z.B. Rollbacks in der Datenbank durchzuziehen.

BigAl 12. Sep 2008 20:36

Re: Logout nach Zeit
 
Zitat:

Zitat von guidok
Ich habe keine elegantere Lösung, aber ich stelle mir gerade vor, mit deinem Programm zu arbeiten, irgendwelche Daten eingebe oder bearbeite, kurz auf die Toilette muss, dabei vielleicht jemanden treffe und einen Plausch (natürlich dienstlich) halte, zurück komme und feststellen muss, dass meine bisherige Arbeit für die Katz war, weil mich das Programm abgemeldet hat.


Hi,

daztu muss man sagen, dass es sich bei dem Programm eine Software handelt, welche dediziert auf einem Rechner läuft. Der Rechner selbst dient dazu Daten von einem Prozess zu erfassen und wird vom Bedienpersonal Vorort sporadisch bedient. Ich bin Automatisierer und - wie der Name schon sagt - passiert bei dem Programm fast alles automatisch. Der Login ist für den Administrator notwendig um die Prozessparameter einzustellen. Hierbei handelt es sich um ein paar hunder Parameter, welche in den verschiedensten Masken gepflegt werden können... Is also nix mit aufs Klo gehen :-)

Ach ja: Verloren geht auch nichts, da die Parameter jeweils bei der eingabe gespeichert werden und die Dialog eigentlich eh hauptsächlich zur Auswertung der Daten (Charge suchen etc) sind...

Soviel zum Hintergrund... Man muss halt immer auch wissen wofür die Software ist, ehe man darüber urteilt :wink:

Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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