Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.
Seite 1 von 2  1 2      

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