Announcement

Collapse
No announcement yet.

SetCapture in Delphi

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SetCapture in Delphi

    Hi alle zusammen,
    die Funtion SetCapture ist meiner meinung nach in Delphi etwas unterentwickelt:
    1. Es werden nur die Mausereignisse "MouseDown" uns "MouseUp" an das betreffende Fenster geschickt.
    2. Diese werden im Zielfenster gleichzeitig (bzw. sehr kurz hintereinander) ausgelöst, und zwar beide im Augenblick, in dem die Maustaste gedrückt wird.
    3. Die unter der Maus liegende Anwendung (z.B. beim Klick ausserhalb des Fensters an irgendeiner Stelle des Desktops) wird trotzdem aktiviert. D.h. das Fenster, das die Mausereignisse empfangen soll, verliert den Fokus.

    Hat sich jemand mit der Materie schon beschäftigt?
    Kann mir vielleicht jemand Tipps geben, wie man die Ereignisumleitung in Griff bekommt.

    Wäre für jeden Tipp dankbar.

  • #2
    Ich würde sage das das Capture auf grund der "Unterentwicklung" im Windows API so schlecht ist. Andererseits was willste verlangen ? Das Capture soll die Mausereignisse an das Capture Fenster weiterleiten, mehr NICHT.<br>
    1.) es werden alle Klick und Move Ereignisse der Mause weitergeleitet<br>
    2.) ist normal, oder wie lang soll den eine "Verzögerung" zwischen einem Down und Up sein ?<br>
    3.) Hier mischen sich zwei wesentliche Dinge. Einerseits das Mausecapture und andererseits das Fensterfokusierungssystem. Was hat nun Vorfahrt ? Das Capture IST ein kurzeitiges und wenigerpreviligiertes Hilfsmittel. Generell wird das Fokussystem sich den Capture holen bzw. zerstören wenn es nötig ist.<br>

    Eine Anwendunge, bzw. WICHTIGE, Routinen sollten sich niemals auf das Capture verlassen. Jede andere Anwendung oder das System kann zu jeder Zeit das Mausecapture mit ReleaseCapture() freigeben oder aber mit SetCapture() ein eigenes einrichten.<br>

    Übrigens sollte im Delphi mit SetCaptureControl() gearbeitet werden.<br>

    Gruß Hage

    Comment


    • #3
      Hallöchen Hagen,
      vielen Dank erstmal für Deine Antwort.

      Die Funktion SetCapture(FensterHandle) soll laut Definition alle Mausereignisse an das gegebene Fenster leiten. Und das so lange, bis die Funktion ReleaseCapture() aufgerufen wird.
      Unter "alle" verstehe ich "Click", "DblClick", "MouseDown", "MouseUp", "MouseMove" usw.

      Folgenden Code habe ich dazu gebaut:

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      SetCapture(Self.Handle);
      end;

      procedure TForm1.Button2Click(Sender: TObject);
      begin
      ReleaseCapture;
      end;

      procedure TForm1.Button3Click(Sender: TObject);
      begin
      ListBox1.Clear;
      end;

      procedure TForm1.FormClick(Sender: TObject);
      begin
      ListBox1.Items.Add('Click');
      end;

      procedure TForm1.FormDblClick(Sender: TObject);
      begin
      ListBox1.Items.Add('DblClick');
      end;

      procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      begin
      ListBox1.Items.Add('MouseDown');
      end;

      procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      begin
      //ListBox1.Items.Add('MouseMove'); Das stört ein wenig
      end;

      procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      begin
      ListBox1.Items.Add('MouseUp');
      end;

      Was auffällt:

      Nach dem Click auf Button1 erwarte ich, daß alle Mouesereignisse in die Listbox1 eingetragen werden, wenn ich ausserhalb des Fensters aktiv bin.
      So ist es aber nicht:

      1. MouseMove wird gar nicht augewertet (wenn man die auskommentierte Zeile wieder einkommentiert)

      2. Beim Klicken wird nur MouseUp und MouseDown augewertet - und das so, daß beide Ereignisprozeduren abgearbeitet werden, wenn ich die Maustaste gedrückt habe. Das Loslassen der Maustaste nimmt das Fenster nicht mehr auf. Genauso wie alle anderen folgenden Mausereignisse (Es sei denn, ich drücke noch mal Button1).

      3. ReleaseCapture scheint hier überflüssig zu sein.

      4. Und ich denke, daß das Fenster sein Fokus behalten müßte, auch wenn ich nach Aufruf von SetCapture irgendwo auf dem Desktop herumklicke, wie wahnsinnig. Bis zum Aufruf von ReleaseCapture eben. Da dürfen keine Links etc. ausgeführt werden.

      Fazit:
      Entweder verstehe ich den Sinn der Funtion SetCapture nicht, oder ich wende sie falsch an.

      Bis denne
      Mariu

      Comment

      Working...
      X