Einzelnen Beitrag anzeigen

Hofes

Registriert seit: 11. Apr 2019
10 Beiträge
 
Delphi 10.3 Rio
 
#1

WM_TOUCH und GetTouchInputInfo

  Alt 11. Apr 2019, 10:45
Hallo miteinander !

Ich habe mich in den letzten Tagen mit der Funktion GetTouchInputInfo und der Windows Message WM_TOUCH beschäftigt.
Und schon sämtliche Foren und Artikel durchstöbert. Leider wurde ich nicht fündig und erhoffe mir nun hier eine Lösung zu meinem Problem.

Ich möchte eigentlich nur 1-5 Finger auswerten um dann meine eigene Funktionen zu schreiben.
Über die msg bekomme ich standartmäßig nur die Koordinaten des ersten Fingers heraus, aber keine Flags und auch nicht die anderen
Finger, deswegen habe ich nach einer Funktion gesucht die mir alle Informationen zur verfügung stellt - GetTouchInputInfo.
Aber bei dem Aufruf von GetTouchInputInfo bekomme ich immer als Rückgabewert "False" zurück, was soviel heißt wie "ERROR_INVALID_HANDLE".
Ich habe schon sämtliche castings getestet (THandle/Uint64/Uint32/int64/int64(msg.lParam)), aber immer bekomme ich ungültiger Handle zurück.

Ich bin im Prinzip so vorgegangen wie "ich2" vor 9 Jahren:
https://www.delphipraxis.net/156146-...elphi-7-a.html
Allerdings musste ich die user32.dll nicht importieren, da sie ja schon in der Winapi.Windows enthalten ist.


Ich benutze einen SIEMENS IPC 477e Pro mit Multitouch auf dem die Anwendung laufen soll.
(Touch wird erkannt, habe schon eine andere Anwendung darauf getestet)
Und Programmiert wird mit Delphi 10.3.1 Rio auf Windows 10.
Den Code habe ich auch schon mit Delphi 2010 getestet - Allerdings bekomme ich da den selben Fehler.

Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.AppEvnts, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure AppMessage(var Msg: tagMSG; var Handled: Boolean);
  public
    touchinput : array of TTouchInput;
    succes : boolean;
  end;
var

  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.AppMessage(var Msg: tagMSG; var Handled: Boolean);
var
  le, i, lp : integer;
begin

  if Msg.message = WM_TOUCH then
  begin
    Handled:= false;
    lp := Msg.lParam;
    SetLength(touchinput, msg.wParam);

    succes := GetTouchInputInfo(Msg.lParam, Msg.wParam, @Touchinput[0], SizeOf(TTouchinput));
    le := GetLastError; //Hier erscheint immer der ErrorCode 6 - "ERROR_INVALID_HANDLE"
    //ShowMessage(BoolToStr(succes));
    Memo1.Clear;
    Memo1.Lines.Add('suceeded: ' + BoolToStr(succes));
    Memo1.Lines.Add('lasterror: ' + IntToStr(le));
    Memo1.Lines.Add('msg.wparam: ' + IntToStr(Msg.wParam));
    Memo1.Lines.Add('msg.lparam: ' + IntToStr(Msg.lParam));
    Memo1.Lines.Add('msg.hwnd: ' + IntToStr(msg.hwnd));
    for i := 0 to msg.wParam - 1 do
    begin
      memo1.Lines.Add(IntToStr(Touchinput[i].cxContact));
      memo1.Lines.Add(IntToStr(Touchinput[i].cyContact));
    end;
    Handled:= true;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //ShowMessage(IntToStr(GetSystemMetrics(SM_DIGITIZER)));
  RegisterTouchWindow ( Form1.Handle, 0 );
  Application.OnMessage:= AppMessage;
end;
end.
Viele Grüße Hofes
  Mit Zitat antworten Zitat