AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Auto logout nach Zeit

Ein Thema von norwegen60 · begonnen am 7. Apr 2022 · letzter Beitrag vom 8. Apr 2022
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
463 Beiträge
 
Delphi 10.3 Rio
 
#1

Auto logout nach Zeit

  Alt 7. Apr 2022, 15:25
Hallo zusammen,

mit Application.OnMessage ist es recht einfach, einen Timer zurück zu setzen sobald Tastatur oder Maus betätigt wurde. Das funktioniert aber nur, wenn diese Änderung innerhalb meiner Anwendung passiert.

Wie kann ich Maus- oder Tastatur-Ereignisse erfassen, wenn die außerhalb meiner Anwednung auftreten? Kann sein, weil meine Anwendung nur ein Teil es Bildschirms einnimmt oder weil z.B. Office davor geöffnet wurde.

Grüße
Gerd
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.586 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Auto logout nach Zeit

  Alt 7. Apr 2022, 15:37
Ich beantworte jetzt nicht unbedingt Deine Frage, würde aber empfehlen nicht auf diese Art und Weise die Aktivität des Nutzers zu testen, dass kann dieser über die Winodws-Funktion "Automatisches Sperren". Eher würde ich empfehlen zu reagieren, wenn der Nutzer eine Funktion im Programm ausführt und dann die Session zu verlängern. Wenn das Programm nicht genutzt wird, dann läuft die Session in Ruhe ab.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.973 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Auto logout nach Zeit

  Alt 7. Apr 2022, 18:53
Ohne dein genaues Anwendungsszenario zu kennen:

Es gibt unter Windows die Methode GetLastInputInfo(..)

Als Delphi verpackt sieht das bei uns so aus:

Delphi-Quellcode:
uses System.TimeSpan, System.SysUtils, Winapi.Windows;

function TTimes.getSinceLastInput(): TTimeSpan;
var
   lastInput: TLastInputInfo;
   currentTickCount: DWORD;
   millisecondsPassed: Double;
begin
   lastInput := Default(TLastInputInfo);
   lastInput.cbSize := SizeOf(TLastInputInfo);

   Win32Check( GetLastInputInfo(lastInput) );
   currentTickCount := GetTickCount();

   // lastInput was before 49.7 days but by now, 49.7 days have passed
   if (lastInput.dwTime > currentTickCount) then
      begin
         millisecondsPassed :=
            (DWORD.MaxValue - lastInput.dwTime)
            +
            (currentTickCount * 1.0); // cast to float by multiplying to avoid DWORD overflow
         Result := TTimeSpan.FromMilliseconds(millisecondsPassed);
      end
   else
      Result := TTimeSpan.FromMilliseconds(currentTickCount - lastInput.dwTime );
end;
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
954 Beiträge
 
Delphi 6 Professional
 
#4

AW: Auto logout nach Zeit

  Alt 7. Apr 2022, 20:22
Hmm..

Wenn Du auf Tastendruck oder Mausbewegung reagieren willst, welche außerhalb deiner App erfolgen, dann wirst Du nicht um einen Low-Level Hook herum kommen....
In einer Schleife/Timer den letzten Tastendruck abzufragen ist unschön


Hier mal ein Schnipsel:

Delphi-Quellcode:
type
  tagKBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: DWORD;
  end;
  TKbdDLLHookStruct = tagKBDLLHOOKSTRUCT;
  PKbdDLLHookStruct = ^TKbdDLLHookStruct;

var
  HookHandle : HHOOK;
  WindowHandle : Hwnd;

function LowLevelKeyboardProc(nCode: Integer; wParam: wParam;
    lParam: lParam): LRESULT; stdcall;
  var vkCode: Cardinal;
begin
  if (nCode >= 0) and (wParam = WM_KEYDOWN) then
  begin
    vkCode := PKbdDLLHookStruct(lParam)^.vkCode;
    Form1.Memo1.Lines.Add('vkCode ' + IntToStr(PKbdDLLHookStruct(lParam)^.vkCode));
    Form1.Memo1.Lines.Add('scanCode ' + IntToStr(PKbdDLLHookStruct(lParam)^.scanCode));
    Form1.Memo1.Lines.Add('flags ' + IntToStr(PKbdDLLHookStruct(lParam)^.flags));
    Form1.Memo1.Lines.Add('time ' + IntToStr(PKbdDLLHookStruct(lParam)^.time));
    Form1.Memo1.Lines.Add('dwExtraInfo ' + IntToStr(PKbdDLLHookStruct(lParam)^.dwExtraInfo));
    // meine Anweisungen
    PostMessage(WindowHandle, WM_SYSKEYDOWN, vkCode, lParam);

  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;

function InstallHook(Hwnd: Cardinal): Boolean;
begin
  Result := False;
  if HookHandle = 0 then
  begin
    HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
    WindowHandle := Hwnd;
    Result := HookHandle <> 0;
  end;
end;

function UninstallHook: Boolean;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.973 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Auto logout nach Zeit

  Alt 7. Apr 2022, 22:19
Man braucht keinen LowLevel-Hook, das eins weiter oben angesprochene GetLastInputInfo(..) ist ausreichend.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
463 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Auto logout nach Zeit

  Alt 7. Apr 2022, 23:15
Die Lösung von Günter erfüllt genau das was ich gesucht habe. Vielen Dank dafür.

Eine Frage hätte ich aber noch. Was führt denn alles dazu, dass die Idle time wieder zurück gesetzt wird. Ich hatte z.B. mal eine Maus, die je nach Lage gezittert hat. Das konnte ich in OnMessage abfangen, indem ich die Bewegung von 1 Pixel auf 5 erhöht habe.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.973 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Auto logout nach Zeit

  Alt 8. Apr 2022, 08:48
Input ist Input. Wenn du jetzt dir jeden Input genau anschauen und auf Plausibilität prüfen möchtest, dann ist der angesprochene Low Level-Hook wohl doch etwas für dich 😉
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf