![]() |
Touchscreen, Cursorabfrage
Hallo,
ich habe eine Anwendung die nach 5 min ohne Benutzeraktion in eine Art Homeposition wechseln soll. Das Problem macht mir ein eingebetteter WebBrowser zur PDF Anzeige. (Edge Chromium) Da das PDF in dessen internen Betrachter angezeigt wird, funktionieren keinerlei Events wie onClick etc. Ab hier sehe ich zwei Wege eine Benutzeraktion mitzubekommen. 1. Eine zwischengeschaltete HTML Seite, welche das PDF in einem iFrame anzeigt, meldet sich via Javascript an den Wrapper. 2. Ich versuche die Mausposition abzufangen und werte nur aus, ob sie sich seit dem letzten Mal bewegt hat. zu 1.: Das Event onClick oder onScroll vom iFrame bezieht sich nur auf den iFrame und nicht auf ein dort vorhandenes PDF Dokument zu 2.: Versuche die Cursorposition zu ermitteln funktionieren nur bedingt mit einem Touchscreen. GetCursorPos geht nur solange ich nicht im Browser herumklicke. GetTouchInputInfo hat mich auch nicht wirklich weiter gebracht, weil mein Programm nie eine wm_touch message erhält wenn ich im Browser herumklicke. Aktuell versuche ich eine Art Maushook zu erstellen. Gibt es da ein Vorgehen welches Erfolg verspricht? Gruß Andreas |
AW: Touchscreen, Cursorabfrage
![]() ![]() ![]() Und wenn die Anzeige des Browser im selben Thread abläuft, sollten dessen Maus- und Tastatur-Ereignisse durch die MessageQueue des selben Threads rauschen. ![]() |
AW: Touchscreen, Cursorabfrage
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; |
AW: Touchscreen, Cursorabfrage
Mit GetTickCount64 und UInt64 gibt es keinen Überlauf und der Rechner kann über 50 Tage an bleiben.
|
AW: Touchscreen, Cursorabfrage
Zitat:
und somit auch GetTickCount ausreicht. Ja, wenn es länger als 49 Tage keinen Input gab, dann gibt es hiermit ein Problemchen. Einfach den letzten Wert merken und so lange alles ignorieren, wie er sich nicht ändert. Es ist sehr unwahrscheinlich, dass jemand zusällig, nach genau 49,71 Tagen oder 99,42 oder 149,13 oder ...., in genau der selben Millisekunde des Überlaufs eine Eingabe macht. (und falls doch, dann muß er eben die Maus einfach nochmal kurz bewegen) |
AW: Touchscreen, Cursorabfrage
LastUserInput ist nicht das Problem. Da wird es auch keine 50 Tage ohne Eingabe geben.
Code:
Das bringt den Überlauf, wenn der Rechner mehr als 50 Tage ohne Neustart läuft. Und der Überlauf ist dann bei jedem Aufruf, auch wenn die letzte Eingabe 3 min her ist.
currentTickCount := GetTickCount()
Also sollte man schon auf GetTickCount64 und UInt64 umstellen. Dann muss er auch nicht alle 50 Tage neu gestartet werden. |
AW: Touchscreen, Cursorabfrage
Der Überlauf ist vollkommen egal.
Hier kommt es einfach nur auf die Differenz der beiden Werte an. Und die Differenz kann auch nur positiv sein, da ein Ereignis ja nie in der Zukunft liegt.
Delphi-Quellcode:
{$OVERFLOWCHECKS OFF} // Mindestens in Delphis seit 11.2 muß die nun standardmäßig aktive Überlaufprüfung deaktiviert werden
EinCardinalBzwLongWord := GetTickCount - lastInput.dwTime; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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