AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

RawInput und Koordinaten: wie?

Ein Thema von ULIK · begonnen am 3. Nov 2020 · letzter Beitrag vom 6. Nov 2020
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
369 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

RawInput und Koordinaten: wie?

  Alt 3. Nov 2020, 15:21
Hallo,

vielleicht kann mir jemand hier weiterhelfen: ich lese in einer Anwendung über RawInput https://docs.microsoft.com/en-us/win...tdev/raw-input mit, ob es eine Toucheingabe gegeben hat oder nicht. Das funktioniert auch bestens und ich bekomme die Koordinaten der Touchpunkte geliefert.
Nur: diese sind relativ zum Touch-Device. Mit einem einzigen Monitor der touch-fähig ist, ist das auch kein Problem, aber bei einem System mit mehreren Monitoren müßte ich herausfinden, welcher der Monitor denn dem Raw Input zugeordnet ist.

Hintergrund: Ich will aus den Koordinaten der Touchpunkte die Koordinaten dieser Punkte bzgl. dem Screen bestimmen, um zu entscheiden, ob ich mich innerhalb eines Fensters meiner Anwendung befinde oder nicht. Ist auf einem System mit genau einem Monitor kein Problem, da stimmen RawInput und Monitor überein.
Nicht aber auf einem System mit mehreren Monitoren. Der RawInput liefert immer das gleiche Ergebnis, aber abhängig davon, auf welchem Monitor meine Anwendung läuft, sind die Eingaben zu verwerfen oder zu bearbeiten.

Kennt jemand eine Möglichkeit, die Daten des RawInput mit einem Monitor zu verknüpfen? Oder allgemein: wie kann man aus den Daten des RawInput die Position am Screen bestimmen (bei mehreren Monitoren)?


Danke,
Uli
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.558 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: RawInput und Koordinaten: wie?

  Alt 3. Nov 2020, 21:13
Warum nutzt du RawInput? Das Touch Handling in der VCL oder FMX kann sowas nicht?
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
369 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: RawInput und Koordinaten: wie?

  Alt 4. Nov 2020, 09:21
Warum ich das benutze: es geht nicht anders. Die Anwendung verwendet Microsoft Ink-Overlays und diese fangen alle Eingaben schon ab bevor die VCL irgendwas davon zu sehen bekommt. Aufgrund eines (bestätigten) Bugs seit Windows 8 ist es nicht mehr möglich, auf aktiven Ink Overlays Multitouch-Eingaben zu erkennen. Man kann das zwar mit einem Trick umgehen, nur dazu muß man die Info zur Toucheingabe haben BEVOR die Eingabe ins Ink-Overlay geleitet wird, denn sobald sie dort ist, kann man die Einstellungen des Ink-Objekts nicht mehr verändern, was aber nötig ist, um den Trick verwenden zu können.
Die VCL wird bei dieser Ink-Geschichte so ziemlich komplett übergangen und kriegt von Toucheingaben etc. rein gar nichts mit.
  Mit Zitat antworten Zitat
HolgerX

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

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 08:28
Hmm..

Hier eine kleine Funktion, welche prüft, ob sich der Mauszeiger innerhalb der Form befindet.

Delphi-Quellcode:
function TForm1.CheckInForm(AScreenPoint: TPoint): boolean;
var
  tp: TPoint;
begin
  tp := self.ScreenToClient(AScreenPoint); // Umrechnen MousePos zu Pos der Form
  Result := PtInRect(self.ClientRect, tp); // Prüfen, ob Pos 'im' Formular

  // Testweise Position in der Form anzeigen
  if Result then begin
    EditClientPos.Text := IntToStr(tp.X) + ' / ' + IntToStr(tp.Y);
  end else
    EditClientPos.Text := '';
end;
Ich habe das jedoch nur mit SetWindowsHookEx über mehrere Monitore incl. verschieben der Form getestet..

Delphi-Quellcode:
var
  HookHandle: Cardinal;

function LowLevelMouseProc(nCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
var
  p : TPoint;
begin
  if (nCode >= 0) then begin
    p := PMSLLHOOKSTRUCT(lParam)^.POINT;
    if Form1.CheckInForm(p) then begin
      // Bin auf der Form Form...
    end;
  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;

function InstallMouseHook: Boolean;
begin
  Result := False;
  if HookHandle = 0 then
  begin
    HookHandle := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
    Result := HookHandle <> 0;
  end;
end;

procedure DeleteMouseHook;
begin
  if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
end;
Ah..
Die Prüfung liefert auch True zurück, wenn deine Form nicht Aktiv oder gar verdeckt ist. Somit musst Du dass dann noch gegenprüfen.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Alt 5. Nov 2020, 08:30     Erstellt von shakilahmad3212
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
369 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 10:51
Vielen Dank! Werd ich testen. Gerade ob das auch im Zusammenspiel mit InkControls geht.
Ansonsten ist mir noch eine andere Lösung eingefallen: Registriert man mit RegisterRawInputDevices seine Anwendung und gibt hier explizit ein Fensterhandle an, dann werden nur WM_INPUT Nachrichten empfangen, wenn das Fenster auch aktiv ist (also den Fokus hat). Eine Eingabe außerhalb des Fensters führt dazu, daß keine WM_INPUT Nachricht empfangen wird, weil der Fokus von der Anwendung weg geht.
Bekommt man also eine WM_INPUT Nachricht, kann man über das Fensterhandle den zugehörigen Monitor bestimmen. Das klappt zwar nicht immer zu 100%, wenn das Fenster der Anwendung auf mehrere Monitore verteilt ist, aber diesen Fall kann ich ignorieren.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
215 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 11:34
Lässt sich mit dem RawInput laut MS Doku Touchscreen Unterstützung für Uraltprogramme bauen?

Ich habe da noch welche und ein Acer Iconia W510 Tablet, auf dem ich diese Programme installiert habe unter Windows 8.1.

Dazu müsste ich die Mauskoordinaten derart bekommen, dass ich dem Programm vorgaukle ich hätte es mit der Maus bedient. Auch wenn der physische Mauszeiger momentan an einer ganz anderen Stelle ist.

Das Problem ist aber im Gegensatz zu der Aufgabe hier, dass das alte Programm nicht verändert wird. Ich brauche also eine Windows Dienst, der die Mauskoordinaten an den Maustreiber weiter gibt. Ich lese jetzt aber erst mal die Doku zu RawInput.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.368 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 17:22
Wenn dein anderes Programm den Input (Touch) abfängt, dann kann es dem anderen Programm Fenster/Control entsprechende Maus-Messages WM_MOUSEMOVE/UP/DOWN per PostMessage senden.


Wenn das Touch-Gerät aber bei Windows installiert/aktiv ist, dann wandelt doch Microsoft von selbst auf Maus-Emulation um, wenn gerade kein Fenster explizit auf Touch reagiert?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
215 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 18:43
Wenn dein anderes Programm den Input (Touch) abfängt, dann kann es dem anderen Programm Fenster/Control entsprechende Maus-Messages WM_MOUSEMOVE/UP/DOWN per PostMessage senden.


Wenn das Touch-Gerät aber bei Windows installiert/aktiv ist, dann wandelt doch Microsoft von selbst auf Maus-Emulation um, wenn gerade kein Fenster explizit auf Touch reagiert?
Ich habe ne alte Version von Total Commander, da funktioniert das leider nicht immer optimal. Deshalb der Drang, daran was zu ändern, zumal Delphi so ne schöne Komponente wie Gesture besitzt und hier nun eine WinAPI Doku zur Lösung dieses Problemes verlinkt ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.368 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: RawInput und Koordinaten: wie?

  Alt 5. Nov 2020, 19:22
Ist Total Commander nicht Open Source und dazu auch noch Delphi?

Da wäre es doch eigentlich einfacher sowas direkt dort einzubauen
und wenn man mag checkt man vorher eben auch noch eine ältere Version des Codes aus.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.143 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: RawInput und Koordinaten: wie?

  Alt 6. Nov 2020, 07:56
Ist Total Commander nicht Open Source und dazu auch noch Delphi
Das wäre mir neu, falls doch gibt es dazu einen Link zu den Sourcen ?
Bei den Plugins gibt es Einige in OS, meinst Du das ?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 +2. Es ist jetzt 07:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf