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 WM_TOUCH und GetTouchInputInfo (https://www.delphipraxis.net/200340-wm_touch-und-gettouchinputinfo.html)

Hofes 11. Apr 2019 10:45

WM_TOUCH und GetTouchInputInfo
 
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

TiGü 11. Apr 2019 11:33

AW: WM_TOUCH und GetTouchInputInfo
 
Wie ist es denn so?

Delphi-Quellcode:
procedure TForm1.AppMessage(var Msg: tagMSG; var Handled: Boolean);
var
  le: DWORD;
  i: integer;
  lp: HTOUCHINPUT;
begin
  if Msg.message = WM_TOUCH then
  begin
    Handled := false;
    lp := Msg.lParam;
    SetLength(touchinput, Msg.wParam);

    SetLastError(0);
    succes := GetTouchInputInfo(lp, UINT(Msg.wParam), @touchinput[0], SizeOf(TTouchinput));
    Memo1.Clear;
    if succes then
    begin
      Memo1.Lines.Add('suceeded: ' + BoolToStr(succes));
      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
    else
    begin
      Memo1.Lines.Add(SysErrorMessage(GetLastError));
    end;

    if Handled then
    begin
      CloseTouchInputHandle(lp);
    end;
  end;
end;

Hofes 11. Apr 2019 11:41

AW: WM_TOUCH und GetTouchInputInfo
 
"Der Vorgang wurde erflogreich beendet" wird mir in die Memo1 geschrieben.
Aber succes ist noch immer false.

EWeiss 11. Apr 2019 12:09

AW: WM_TOUCH und GetTouchInputInfo
 
Keine Ahnung ob du das schon getan hast.
Aber bevor du WM_TOUCH korrekt auswerten kannst musst du das entsprechende Window vorher für TOUCH registrieren.
Siehe..
RegisterTouchWindow

gruss

Hofes 11. Apr 2019 12:17

AW: WM_TOUCH und GetTouchInputInfo
 
Genau, weil standartmäßig ist WM_GESUTRE aktiv. Das mache ich schon im onCreate vom Form.

Würde ich das Window/Handle nicht für Touch registrieren, dann würde ich auch keine WM_TOUCH messages bekommen.
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //ShowMessage(IntToStr(GetSystemMetrics(SM_DIGITIZER)));
  RegisterTouchWindow(Form1.Handle, 0);
  Application.OnMessage:= AppMessage;
end;

EWeiss 11. Apr 2019 12:18

AW: WM_TOUCH und GetTouchInputInfo
 
Zitat:

Zitat von Hofes (Beitrag 1430070)
Genau, weil standartmäßig ist WM_GESUTRE aktiv. Das mache ich schon im onCreate vom Form.

Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //ShowMessage(IntToStr(GetSystemMetrics(SM_DIGITIZER)));
  RegisterTouchWindow(Form1.Handle, 0);
  Application.OnMessage:= AppMessage;
end;

OK dann sollte das stimmen wollte nur darauf hinweisen.. ;)
Nur als Nachtrag ist es denn das AktiveWindow?

Meines Erachtens sollte man das nicht in Create machen.
Fenster erstellen dann abfragen GetActiveWindow und dann dein Window für Touch registrieren.
Vielleicht hilft es.

Programming-for-Multi-Touch

gruss

Hofes 11. Apr 2019 12:39

AW: WM_TOUCH und GetTouchInputInfo
 
Code:
procedure TForm1.FormActivate(Sender: TObject);
begin
  RegisterTouchWindow(GetActiveWindow, 0 );
end;
du meinst wohl so oder? (Hat aber auch nichts geändert :( )

Sollte eigentlich keine Rolle spielen. Wie gesagt, wenn das Window nicht für den Touch registriert wurde, dann würde garkeine
WM_TOUCH Message kommen.

Zu dem Link: Ich hab ein Beispiel von C# getestet. Das Programm benutzt ja genau die selbe Funktion
https://docs.microsoft.com/en-us/win...hpadwmtouchcs-
Und das funktioniert auf dem TouchPanel.

Kann es sein dass die Message zwischenzeitlich schon wo anderst verwertet wird, und der Handle dadurch invalid wird?

EWeiss 11. Apr 2019 12:44

AW: WM_TOUCH und GetTouchInputInfo
 
Ich kenne das Programm nicht daher kann ich nur Vermutungen anstellen. Sorry.
Du kannst Touch für deine Form registrieren was ist aber wenn anschließend die Memo dein aktives Window ist? bsp. wenn es den Focus hat?

Und dann? Wie gesagt eine Vermutung.

gruss

Hofes 11. Apr 2019 12:51

AW: WM_TOUCH und GetTouchInputInfo
 
Kann ich mir nicht vorstellen, habe auch schon ohne dem Memo getestet und
die Werte einfach in die Caption eines Labels geschrieben - Macht keinen unterschied

EWeiss 11. Apr 2019 12:57

AW: WM_TOUCH und GetTouchInputInfo
 
Zitat:

Zitat von Hofes (Beitrag 1430084)
Kann ich mir nicht vorstellen, habe auch schon ohne dem Memo getestet und
die Werte einfach in die Caption eines Labels geschrieben - Macht keinen unterschied

OK dann bin ich raus. ;)
Ich frage mich nur noch eins wenn ich auf einem Button klicke welche Message wird dann gesendet die deiner Form oder die des Button.
Und welche Winproc ist dann dafür zuständig die des Button(Fenster) oder die deiner Form(Fenster).
Beides sind Fenster welches ist dann das Aktive?

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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