AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Touchscreen, Cursorabfrage

Ein Thema von MechMac666 · begonnen am 21. Mär 2023 · letzter Beitrag vom 22. Mär 2023
Antwort Antwort
MechMac666

Registriert seit: 9. Nov 2008
93 Beiträge
 
#1

Touchscreen, Cursorabfrage

  Alt 21. Mär 2023, 20:01
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 00:31
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Mär 2023 um 00:38 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 08:49
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;
  Mit Zitat antworten Zitat
peer81

Registriert seit: 19. Mär 2008
13 Beiträge
 
#4

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 10:14
Mit GetTickCount64 und UInt64 gibt es keinen Überlauf und der Rechner kann über 50 Tage an bleiben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#5

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 13:09
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Mär 2023 um 13:16 Uhr)
  Mit Zitat antworten Zitat
peer81

Registriert seit: 19. Mär 2008
13 Beiträge
 
#6

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 15:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#7

AW: Touchscreen, Cursorabfrage

  Alt 22. Mär 2023, 16:53
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:27 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