Einzelnen Beitrag anzeigen

Benutzerbild von ULIK
ULIK

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

AW: Hook WH_GESTURENOTIFY

  Alt 28. Jul 2015, 16:52
Hi Mossi,

willst Du wirklich WM_GESTURENOTIFY hooken? Ich würde es eher mit WM_GESTURE probieren, da hier dann die relevanten Aktionen stattfinden.

Hier mal ein bischen Code, wie ich ihn bei mir verwende (allerdings will ich da nur Gestures innerhalb des Programms auswerten). Vieleicht hilft's Dir ja

Delphi-Quellcode:
procedure XYZ.WndProc(var Message: TMessage);
var
  bResult: Boolean;
  gi: GESTUREINFO;
  ptPosition: TPoint;
begin
  case Message.Msg of
    WM_GESTURE:
      begin
        ZeroMemory(@gi, SizeOf(gi));
        gi.cbSize := SizeOf(gi);
        bResult := GetGestureInfo(Message.LParam, gi);
        if bResult then
        begin
          case gi.dwID of
            GID_ROTATE: // Drehung
              begin
                case gi.dwFlags of
                  GF_BEGIN: ...;
                  GF_END: ...;
                else
                  ...;
                end;

                // Und weitere Verarbeitung abbrechen
                Message.Result := 1;
                Exit;
              end;

            GID_ZOOM: // Zoom
              begin
                case gi.dwFlags of
                  GF_BEGIN:
                    ...
                       
                    
                  GF_END:
                    begin
                      ...
                    end;
                else
                  FZoomValueTracker.CurrentValue := gi.ullArguments;
                end;

                // Und weitere Verarbeitung abbrechen
                Message.Result := 1;
                Exit;
              end;

            GID_PAN:
              begin
                // aktuelle Position bestimmen
                ptPosition := Point(gi.ptsLocation.x, gi.ptsLocation.y);

                // Panning beginnen oder beenden
                if (gi.dwFlags and GF_BEGIN) = GF_BEGIN then
                begin
                  // Und Position merken
                  FLastPanningPosition := ptPosition;

                  // Panning aktivieren
                  StartPanning(ScreenToClient(ptPosition), False, True);

                  // Feedback verwenden
                  FPanningData.UseFeedback := True;
                  BeginPanningFeedback(Handle);
                end
                else if (gi.dwFlags and GF_END) = GF_END then
                begin
                  // Feredback deaktivieren
                  EndPanningFeedback(Handle, True);
                  CancelPanning;

                  // Und aktuelle Seite aktivieren wenn Gesture-Ende
                  OnEndScroll(self);
                end
                else
                begin
                  // Panning durchführen
                  TrackPanning(ScreenToClient(ptPosition));

                  // Panning Feedback geben
                  if FPanningData.UseFeedback then
                    UpdatePanningFeedback(Handle, -FPanningData.FeedbackOffset.X, -FPanningData.FeedbackOffset.Y, (gi.dwFlags AND GF_INERTIA) = GF_INERTIA);

                end;

                // Und weitere Verarbeitung abbrechen
                Message.Result := 1;
                Exit;
              end;

            GID_END:
              begin
                // zur Sicherheit
                CancelPanning;
              end;
          end;
        end;
      end;

  end;

  inherited WndProc(Message);
end;

Grüße,
Uli
  Mit Zitat antworten Zitat