Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Touchscreen, Cursorabfrage (https://www.delphipraxis.net/212722-touchscreen-cursorabfrage.html)

MechMac666 21. Mär 2023 20:01

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

himitsu 22. Mär 2023 00:31

AW: Touchscreen, Cursorabfrage
 
MSDN-Library durchsuchenGetCursorPos
MSDN-Library durchsuchenGetLastInputInfo + MSDN-Library durchsuchenGetTickCount

Und wenn die Anzeige des Browser im selben Thread abläuft, sollten dessen Maus- und Tastatur-Ereignisse durch die MessageQueue des selben Threads rauschen.
Delphi-Referenz durchsuchenTApplicationEvents.OnMessage

Der schöne Günther 22. Mär 2023 08:49

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;

peer81 22. Mär 2023 10:14

AW: Touchscreen, Cursorabfrage
 
Mit GetTickCount64 und UInt64 gibt es keinen Überlauf und der Rechner kann über 50 Tage an bleiben.

himitsu 22. Mär 2023 13:09

AW: Touchscreen, Cursorabfrage
 
Zitat:

GetTickCount64
Das ist hier vollkommen egal, da LastUiserInput so oder so nur 32 Bit liefert
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)

peer81 22. Mär 2023 15:43

AW: Touchscreen, Cursorabfrage
 
LastUserInput ist nicht das Problem. Da wird es auch keine 50 Tage ohne Eingabe geben.

Code:
currentTickCount := GetTickCount()
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.

Also sollte man schon auf GetTickCount64 und UInt64 umstellen. Dann muss er auch nicht alle 50 Tage neu gestartet werden.

himitsu 22. Mär 2023 16:53

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 03:28 Uhr.

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