Hatte genau den selben Anwendungsfall, und habe es auch über GetLastInputInfo gelöst und nie Probleme damit gehabt(*), da das auch zuverlässig Bedienung über TeamViewer oder VNC mit abdeckt, unabhängig davon, ob es Bedienung über Tastatur, Maus oder Touch ist.
(*) Vorsicht wenn der 32-Bit-Wert für die Millisekunden nach knapp 50 Tagen überläuft. Den Fehler musste ich auch erst mal machen, sodass unser System nach 50 Tagen Laufzeit immer meinte, der 5-Minuten-Timeout sei überschritten und dann kontinuierlich immer auf "Standard-Ansicht" zurückgestellt hat 😣
Ohne weitere Prüfung, der Teil zum Feststellen "
Wann hat das letzte mal einer was auf dem Bildschirm gemacht?" sieht bei uns so aus:
Delphi-Quellcode:
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;