Panel i dotyk 4 palców

0

Chciałbym aby panel otrzymał komunikaty WM_TOUCH (np. 4 palce na ekranie)

TPanel = class(ExtCtrls.TPanel)
protected
  procedure CreateWnd; override;  // RegisterTouchWindow(Handle, 0);
  procedure DestroyWnd; override;  // UnregisterTouchWindow(Handle);
  procedure WMTouch(var Message :TMessage); message WM_TOUCH; //
end;

W pustym projekcie to działa . Jak chce to przenieść do docelowego projektu
to zdarzenia przychodzą tylko czasami ( panel otrzymuje komunikaty WM_TOUCH do pierwszego puszczenia palca )

  • uruchamiam aplikacje , nie ma komunikatów WM_TOUCH
  • przełączam sie na inna aplikacje i wracam na moją , sa komunikaty WM_TOUCH, póki nie oderwę palca od ekranu

program spy++ pokazuje ze po puszczeniu palca mój panel nie dostaje komunikatów WM_TOUCH

0

A czy zarejestrowałeś ten komunikat dla tego okna przez RegisterTouchWindow ? bo tylko w komentarzu masz opis a w kodzie ?

0

Przepraszam ze nie dość jasno napisałem !

CreateWnd wykonuje RegisterTouchWindow(Handle, 0);
DestroyWnd wykonuje UnregisterTouchWindow(Handle);

Pierwsze dotkniecie w moj panel dziala , jak oderwe palce od ekranu to kolejne dotknięcia juz nie działają

0

Nasz forumowy kolega @woolfik mierzył się z podobnym zadaniem Jak zrobić globalny HOOK na WM_TOUCH?
może coś podpowie :)

0

Czy w WMTouch wywołujesz inherited (co w konsekwencji powinno wywołać DefWindowProc ) ewentualnie CloseTouchInputHandle?

0
{$IFDEF MULTI_TOUCH}

// na podstawie https://andnotor.developpez.com/tutoriels/delphi/delphi-et-le-multitouch/
procedure TPanel.WMTouch(var Message: TMessage);
  function TouchPointToPoint(const TouchPoint: TTouchInput): TPoint;
  begin
    Result := Point(TouchPoint.X div 100, TouchPoint.Y div 100);
    PhysicalToLogicalPoint(Handle, Result);
  end;
var
  TouchInputs: array of TTouchInput;
  TouchInput: TTouchInput;
  Handled: Boolean;
  Point: TPoint;
  s: string;
begin
  Handled := False;
  SetLength(TouchInputs, Message.WParam);
  GetTouchInputInfo(Message.LParam, Message.WParam,
  @TouchInputs[0], SizeOf(TTouchInput));
  try
    s := '';
    for TouchInput in TouchInputs do
    begin
      Point := TouchPointToPoint(TouchInput);
      //if PtInRect(BoundsRect, Point) then
      begin
        // Form8.Caption :=  'Touch ID: ' + IntToStr(TouchInput.ID) +;
        //Top := Point.Y - 100;
        s := s + Format('%d (%d;%d) ||',[TouchInput.ID,Point.X, Point.Y ] );
      end;
      Handled := True;
    end;
    //Form8.Caption := s;
    AllocConsole;
    Writeln(s);
  finally
    if Handled then
      CloseTouchInputHandle(Message.LParam)
    else
      inherited;
  end;
end;
{$endif}
0

przyznaje się że sam napsułem , ze dwa lata temu robiłem podchody do ekranu dotykowego i użyłem GestureManager ,
teraz jak che użyć WM_TOUCH jest to problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1