Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RawInput und Koordinaten: wie? (https://www.delphipraxis.net/205954-rawinput-und-koordinaten-wie.html)

ULIK 3. Nov 2020 14:21

RawInput und Koordinaten: wie?
 
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

TurboMagic 3. Nov 2020 20:13

AW: RawInput und Koordinaten: wie?
 
Warum nutzt du RawInput? Das Touch Handling in der VCL oder FMX kann sowas nicht?

ULIK 4. Nov 2020 08:21

AW: RawInput und Koordinaten: wie?
 
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.

HolgerX 5. Nov 2020 07:28

AW: RawInput und Koordinaten: wie?
 
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.

ULIK 5. Nov 2020 09:51

AW: RawInput und Koordinaten: wie?
 
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.

delphifan2004 5. Nov 2020 10:34

AW: RawInput und Koordinaten: wie?
 
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.

himitsu 5. Nov 2020 16:22

AW: RawInput und Koordinaten: wie?
 
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?

delphifan2004 5. Nov 2020 17:43

AW: RawInput und Koordinaten: wie?
 
Zitat:

Zitat von himitsu (Beitrag 1476718)
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.

himitsu 5. Nov 2020 18:22

AW: RawInput und Koordinaten: wie?
 
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. :stupid:

Rollo62 6. Nov 2020 06:56

AW: RawInput und Koordinaten: wie?
 
Zitat:

Zitat von himitsu (Beitrag 1476732)
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 ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr.
Seite 1 von 2  1 2      

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