Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Automatisch abmelden von Benutzer nach Zeit ohne Handlung (https://www.delphipraxis.net/140261-automatisch-abmelden-von-benutzer-nach-zeit-ohne-handlung.html)

Jens Hartmann 14. Sep 2009 19:10


Automatisch abmelden von Benutzer nach Zeit ohne Handlung
 
Hallo,

kann ich es irgendwie einfach realisieren, das ein Programmbenutzer, automatisch abgemeldet wird, wenn er nach Voreingestellter Zeit keine Handlung mehr durchgeführt hat.

Soll heißen, mein Benutzer hat sich in meinem Programm angemeldet, hat irgendwas durchgeführt und verlässt den Arbeitsplatz. Jetzt soll nach voreingestellter Zeit ohne Maus Bewegung etc automatisch alle Freigeschalteten Programmrechte wieder gesperrt werden und der Anmeldebildschirm erscheinen.

Mein Lösungsansatz, wäre mit einem Timer. Ich weiß nur nicht genau, wie ich den Starte. Wie kann ich den Auswerten, das keine aktivität mehr vorhanden ist. Allerdings nur User Aktivität. Das Programm selber führt gewisse Sachen aus, die sollen weiterlaufen.

Außerdem suche ich das Ereignis, welches mir eine neue Aktivität angibt. Dann wäre die Lösung so denke ich ganz einfach.


Delphi-Quellcode:
Keine Aktivität mehr

TimerAutoAbmelden.Enabled := true;

Erneute Aktivität


TimerAutoAbmelden.Enabled := false;


procedure TForm1.AutoAbmeldenTimer(Sender: TObject);
begin
  Abmelden;
end;
Danke schon mal für Eure antworten.

Gruß Jens

rollstuhlfahrer 14. Sep 2009 19:16

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
also ich würde es auch mit einem Timer machen. Du musst halt nur mitbekommen, wenn sich die Maus bewegt, oder eine Taste gedrückt wurde. Dies könnte man noch mit einem Hook kombinieren.
Sieht dann also so aus:

Direkt nach der letzten Aktivität wird der Timer und der Hook gestartet. Löst der Hook aus, wird der Timer erneut gestartet. Löst der Hook nicht aus, läuft der Timer munter weiter. Erkennt das Programm eine Aktivität durch zum Beispiel einen Klick, wird der Timer auch neu gestartet und das Programm arbeitet seine Funktionen ab.

Bernhard

PS: Falls die entsprechenden Rechner ausschließlich für dieses Programm verwendet werden, gäbe es noch die Möglichkeit eines geplanten Tasks. Dann muss dem Programm nur noch mitgeteilt werden, dass es jetzt inaktiv ist.

thkerkmann 14. Sep 2009 19:19

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Hi,

verwende einen Timer und einen Counter.
Mit jeder Aktivität des Benutzers setzt Du den Counter auf einen bestimmten Wert. z.B. 30 für 30 Sekunden.
Stelle den Timer auf eine Sekunde ein, und im TimerEvent zählst Du den Counter runter, solange er >0 ist.
Wenn der dann <=0 wird, sperrst Du dein Programm.

Ich habe gute Erfahrungen mit dieser Lösung gemacht. Du kannst z.B im OnMouseMove und im OnKeyPress den Counter setzen.

Gruss

zeras 14. Sep 2009 19:20

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Warum nimmst du nicht den Bildschirmschoner von Windows? Da kannst du eine Zeit für Inaktivität setzen.
Wir haben im Moment das umgekehrte Problem, dass unsere IT diese Zeit auf 10 min gesetzt hat und das stört so fast jeden in der Firma.
Wenn du das in Delphi nutzen willst, wird es bestimmt eine API Funktion geben, die den Bildschirmschoner einschaltet.

hathor 14. Sep 2009 19:43

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Delphi-Quellcode:
function LastInput: DWord;
var LInput: TLastInputInfo;
begin
  LInput.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(LInput);
  Result := GetTickCount - LInput.dwTime;
end;
.
.
.
Procedure..
BEGIN
if Lastinput>100000 then //100 sec
Lockworkstation; // Programme laufen weiter, aber ohne neue Anmeldung keine Aktion möglich
END;

Jens Hartmann 14. Sep 2009 20:00

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Danke erstmal,

für die schnellen antworten. Das mit dem Timer habe ich momentan so gelößt

Delphi-Quellcode:
procedure Anmelden;
begin
  ....
  AutoAbmelden.Interval := 10000*StrToInt(Zeit);//Zeit in Minuten
  AutoAbmelden.Enabled := true;
  ....
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  AutoAbmelden.Enabled := false;
  AutoAbmelden.Enabled := true;
end;
Zitat:

Zitat von thkerkmann
verwende einen Timer und einen Counter.


Der Counter, müsste eine globale Variable sein. Deshalb frage ich mich, ob das richtig wäre. Müsste ja dann in etwa so aussehen.

Delphi-Quellcode:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Counter := 30; //die 30 kann sich ändern, daher müsste ich jedesmal aus der DB lesen.
end;

procedure TForm1.AutoAbmeldenTimer(Sender: TObject);
begin
  for i := 0 to Counter do
    begin
      ..
      Counter -1;
    end;
  Abmelden.Click;
end;
Gruß Jens

Luckie 14. Sep 2009 21:10

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Was ist gegen die Lösung von hathor einzuwenden?

Jens Hartmann 14. Sep 2009 21:15

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Zitat:

Zitat von luckie
Was ist gegen die Lösung von hathor einzuwenden?

Nichts, habe ich nur noch nicht ausprobieren können. Werde das aber noch machen.

Gruß Jens

thkerkmann 19. Sep 2009 11:49

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
So hab ich das aber nicht gemeint:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Counter := 30; //die 30 kann sich ändern, daher müsste ich jedesmal aus der DB lesen.
end;

procedure TForm1.AutoAbmeldenTimer(Sender: TObject);
begin
  for i := 0 to Counter do
    begin
      ..
      Counter -1;
    end;
  Abmelden.Click;
end;
Der Counter kann eine Variable deines Forms sein - nicht Global.
Was soll die Schleife ?

Delphi-Quellcode:
type
  TForm1 = class(TForm)
   ...
   FCounter: integer;
   FCounterStart: integer;
   ...
  end;

procedure TForm1.OnCreate (Sender:TObject);
begin
  FCounterStart := AusDBGelesen;
  FCounter := FCounterStart;
end;

procedure TForm1.Anmelden;
begin
  FCounterStart := AusDBGelesen; // auch hier möglich und sinnvoll.
  FCounter := FCounterStart;
end;

procedure TForm1.OnMouseMove(...);
begin
  FCounter := FCounterStart;
end;

procedure TForm1.AutoAbmeldenTimer(Sender:tObject);
begin
  if FCounter > 0 then
  begin
    dec(FCounter);
    if FCounter = 0 then
       Abmelden;
  end;
end;
Ich verwende in meinen Programmen gerne Actionlists. Hier kann man prima ein OnAction Event programmieren, bei dem man den FCounter wieder auf FCounterStart zurücksetzt. Da braucht man keinen Hook, kein OnMouseMove oder onKeypress. Man kann natürlich auch alle drei verwenden um den FCounter zu retriggern.

Gruss

hathor 19. Sep 2009 14:28

Re: Automatisch abmelden von Benutzer nach Zeit ohne Handlun
 
Mehr Infos zu

LASTINPUTINFO: Wenn kein keybd_event und kein mouse_event erfolgt, wird ein Zähler hochgezählt.
Wird ein gewählter Zählerstand (z.B. 100 000 = 100 sec) erreicht (Timer-Abfrage) , wird die WINDOWS-Funktion
LockWorkStation ausgelöst. Alle Programme laufen weiter, aber Tastatur- und Maus-Aktionen werden ohne
Neuanmeldung ignoriert.

http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx


Der Zählerstand wird auf 0 gesetzt mit dem Befehl mouse_event(0,0,0,0). Den kann man z.B. einfügen (if HIDexist then mouse_event(0,0,0,0)... , wenn der User einen bestimmten USB-Stick benutzt (HID: hiddev.ProductName, hiddev.Attributes.VendorID, hiddev.Attributes.ProductID, hiddev.SerialNumber). Entfernt der User den Stick, wird ein OnRemoval-Ereignis ausgelöst und LockWorkStation wird aktiv.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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-2025 by Thomas Breitkreuz