![]() |
RawInput und Koordinaten: wie?
Hallo,
vielleicht kann mir jemand hier weiterhelfen: ich lese in einer Anwendung über RawInput ![]() 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 |
AW: RawInput und Koordinaten: wie?
Warum nutzt du RawInput? Das Touch Handling in der VCL oder FMX kann sowas nicht?
|
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. |
AW: RawInput und Koordinaten: wie?
Hmm..
Hier eine kleine Funktion, welche prüft, ob sich der Mauszeiger innerhalb der Form befindet.
Delphi-Quellcode:
Ich habe das jedoch nur mit SetWindowsHookEx über mehrere Monitore incl. verschieben der Form getestet..
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;
Delphi-Quellcode:
Ah..
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; 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. |
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. |
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. |
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? |
AW: RawInput und Koordinaten: wie?
Zitat:
|
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: |
AW: RawInput und Koordinaten: wie?
Zitat:
Bei ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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