AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hook WH_GESTURENOTIFY

Ein Thema von Mossi · begonnen am 28. Jul 2015 · letzter Beitrag vom 29. Jul 2015
Antwort Antwort
Mossi

Registriert seit: 6. Feb 2004
Ort: Wenzenbach
35 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Hook WH_GESTURENOTIFY

  Alt 29. Jul 2015, 09:32
Jetzt wird's wohl schwierig... Ich häng nämlich immer noch bei Delphi 7 fest und da hab ich keine komfortablen Touch-Properties. Also hab ich schon, aber ich bräuchte die entsprechenden API Aufrufe dafür

Aber, wenn ich nach dieser Seite geh (http://wiki.helpmvp.com/home/notes/touch) muss ich in der Anwendung nur speziell was setzen, wenn ich auf WM_TOUCH gehen will. Das möchte ich aber erst einmal vermeiden, weil ich befürchte, dass es damit noch komplizierter wird.

Gibt es eigentlich irgendeine Möglichkeit, dass ich Touchevents auf einem Nicht-Touch-Fähigen Gerät simuliere? Aktuell ist das ein bisschen unhandlich, wenn ich immer wieder eine neue Exe erstellen muss und dann auf das Surface kopiere, um sie auszuprobieren um dann zu sehen, dass es wieder nicht klappt.
Und Delphi auf dem Surface installieren... Naja. Delphi 7 installieren mit allen notwendigen Komponenten ist einfach kein Spaß und zudem ist das Surface zum Entwickeln auch viel zu klein finde ich.
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Hook WH_GESTURENOTIFY

  Alt 29. Jul 2015, 10:55
Ok, daran hab ich nicht gedacht.

Was kriegst denn so an Messages rein, wenn Du einfach nur ein Formular nimmst und dessen WNDProc überschreibst und auf WM_GESTURE und WM_GESTURENotify hörst? Und zwar wenn Du ein Panning mit einem und mit zwei Fingern machst, bzw. eine Zoom-Gesture.

Zum Testen: mein Entwicklungsrechner/Monitor ist auch nicht Touchfähig, sprich ich schieb das Programm immer auf das Surface und logge dort die Meldungen mit. Eine andere Möglichkeit kenn ich auch nicht.


Grüße,
Uli
  Mit Zitat antworten Zitat
Mossi

Registriert seit: 6. Feb 2004
Ort: Wenzenbach
35 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Hook WH_GESTURENOTIFY

  Alt 29. Jul 2015, 11:29
So. Und jetzt bin ich vollkommen verwirrt.
Ich hab ein kleines Testprogramm erstellt. Nur eine Form, ein Memo und eben die wndproc überschrieben, damit die einkommenden Nachrichten ausgegeben werden. Jetzt kommt nur noch MouseMove an und weder Gesture noch GestureNotify noch sonst irgendwas.
Was hab ich denn jetzt wieder übersehen?

Delphi-Quellcode:
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { private declarations }
    procedure Output(message: string);
  protected
    procedure wndproc(var message: TMessage); override;
  public
    { public declarations }
  end;

const
  WM_TOUCH = $0240;
  WM_GESTURE = $0119;
  WM_GESTURENOTIFY = $011A;

var
  Form1: TForm1;

implementation

procedure TForm1.Output(message: string);
begin
  OutputDebugString(PChar(message));
  Memo1.Lines.Add(message);
end;

procedure TForm1.wndproc(var message: TMessage);
begin
  inherited wndproc(message);

  case message.msg of
    WM_TOUCH: Output('WM_TOUCH');
    WM_GESTURE: Output('WM_GESTURE');
    WM_GESTURENOTIFY: Output('WM_GESTURENOTIFY');
    WM_MOUSEMOVE: Output('WM_MOUSEMOVE');
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Hook WH_GESTURENOTIFY

  Alt 29. Jul 2015, 12:46
Hm,

mehr als Du hab ich ein einem Delphi 2007 Testprogramm grad auch nicht gemacht. Ich schau mal, ob ich noch irgendwo Delphi Delphi 7 hab.

edit: Grad mit Delphi 7 getestet: würde funktionieren und die Messages kommen durch bei Zoomgesture über Memo oder Form

Geändert von ULIK (29. Jul 2015 um 12:54 Uhr) Grund: Test mit D7
  Mit Zitat antworten Zitat
Mossi

Registriert seit: 6. Feb 2004
Ort: Wenzenbach
35 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Hook WH_GESTURENOTIFY

  Alt 29. Jul 2015, 14:45
Jetzt hab ich es doch mal mit WM_TOUCH probiert. Das Ausgabe-Kontroll auf dem Lehrerschirm hab ich mit RegisterTouchWindow aktiviert und jetzt bekomme ich auch die WM_TOUCH Meldungen.
Jetzt muss das ganze nur noch im Hook verarbeitet werden und da hab ich dann gleich das nächste Problem:

hier meine HookProcedure, wie sie jetzt aussieht:
Delphi-Quellcode:
function TouchHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  GetTouchInputInfo: function (hTouchInput: HTOUCHINPUT; cInputs: UINT;
                     pInputs: PTOUCHINPUT; cbSize: Integer): BOOL; stdcall;
  res: Boolean;
  lib: Cardinal;
  touchInputs: array of TTouchInput;
  data: CWPSTRUCT;
begin
  Result := CallNextHookEx(Touch_HookHandle, nCode, wParam, lParam);
  if nCode < 0 then
    exit;

  if nCode = HC_ACTION then
  begin
    data := PCWPSTRUCT(lParam)^;
    case data.message of
      WM_GESTURENOTIFY: OutputDebugString('WM_GESTURENOTIFY');
      WM_GESTURE: OutputDebugString('WM_GESTURE');
      WM_TOUCH:
       begin
        OutputDebugString('WM_TOUCH');
        OutputDebugString(PChar(IntToStr(data.lParam) + '/' + IntToStr(data.wParam) + '/' + IntToStr(data.message)));
        lib := LoadLibrary(PChar('user32.dll'));
        if lib <> 0 then
        begin
          GetTouchInputInfo := GetProcAddress(lib, 'GetTouchInputInfo');
          if @GetTouchInputInfo <> nil then
          begin
            SetLength(TouchInputs, data.wParam);
            res := GetTouchInputInfo(HTOUCHINPUT(data.lParam),
              data.wParam, @TouchInputs, SizeOf(TTouchInput));
            if not res then
              OutputDebugString(PChar(SysErrorMessage(GetLastError)))
            else
              OutputDebugString(PChar(IntToStr(touchinputs[0].cxContact) + 'x' + IntToStr(touchinputs[0].cyContact)));
          end;
        end;
       end;
    end;
  end;
end;
Ich laufe jetzt leider immer in einen Fehler. Get TouchInputInfo liefert FALSE zurück und der Fehler von GetLastError ist "invalid handle"
Lieg ich da falsch, wenn ich davon ausgehe, dass in lParam das Handle drin steht? Oder ist es zu diesem Zeitpunkt bereits wieder ungültig.
MSDN schreibt folgendes:
Zitat:
The touch input handle received in the LPARAM of a touch message. The function fails with ERROR_INVALID_HANDLE if this handle is not valid. Note that the handle is not valid after it has been used in a successful call to CloseTouchInputHandle or after it has been passed to DefWindowProc, PostMessage, SendMessage or one of their variants.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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