Freigeben über


Verarbeiten von Eingaben mit DirectManipulation

Dieser Abschnitt bietet eine Übersicht über das Threadingmodell der direkten Bearbeitung , die Verarbeitung von Fensternachrichten durch die direkte Bearbeitung und die Änderung des Status eines Viewports, wenn die Eingabe Ausgabebewegungen zugeordnet wird.

Die direkte Bearbeitung verwendet zwei Threads, um asynchrone Vorgänge zu koordinieren:

UI-Thread : Der Thread, der den der Eingabe zugeordneten HWND besitzt. Dieser Thread besitzt die Initialisierung der direkten Bearbeitung. Maus- und Tastatureingabeverarbeitung erfolgt auch im UI-Thread.

Delegatthread : Der Thread, der von Direct Manipulation erstellt wurde und im Besitz von Direct Manipulation ist. Die Verarbeitung der Toucheingabe erfolgt im Delegatthread.

Eingabeflow

In einer typischen Konfiguration, in der Treffertests im UI-Thread durchgeführt werden, werden Fensternachrichten durch direkte Bearbeitung in der folgenden Reihenfolge verarbeitet:

Diagramm, in der die Reihenfolge der Verarbeitung von Nachrichten angezeigt wird.

Für einen ruhenden Viewport:

  1. Eine Reihe von Fenstermeldungen erreicht den Delegatenthread.
  2. WM_POINTERDOWN und DM_POINTERHITTEST Nachrichten werden vom Delegatthread an den IHT-Thread (Independent Hit Test) gesendet.
  3. Wenn SetContact vom IHT-Thread aufgerufen wird, werden nachrichten möglicherweise vom Delegatenthread an den UI-Thread gesendet, abhängig vom Wert von DIRECTMANIPULATION_HITTEST_TYPE , wenn RegisterHitTestTarget aufgerufen wurde.
  4. Wenn SetContact nicht über den IHT-Thread aufgerufen wird, werden nachrichten immer vom Delegatthread an den UI-Thread gesendet.
  5. Der Client kann SetContact über den UI-Thread aufrufen, damit die direkte Bearbeitung eine Manipulation erkennen kann.
  6. Wenn eine Manipulation erkannt wird, sendet Direct Manipulation eine WM/_POINTERCAPTURECHANGED-Nachricht , um den Client darüber zu informieren, dass die Eingabe durch direkte Bearbeitung verarbeitet wird. Der Viewport status ist auf RUNNING festgelegt, und die Ausgabetransformation wird aktualisiert.
  7. Wenn eine andere Interaktion als eine Bearbeitung erkannt wird, sendet Direct Manipulation die verbleibenden Nachrichten an den UI-Thread.

Bei einem sich in Bewegung befindenden Viewport (mit einer status von RUNNING oder INERTIA) erreicht die Fenstermeldung zuerst den Delegatthread, in dem direct manipulation treffer tests für alle ausgeführten Viewports. Direct Manipulation weist den Kontakt automatisch den entsprechenden Viewports zu, die durch Treffertests identifiziert wurden. Der Viewport status ist RUNNING, und die Ausgabetransformation wird aktualisiert.

In einigen Fällen kann ein Anwendungs-UI-Thread zu langsam sein, um auf Tests zu reagieren. Es kann ein Treffertestthread (RegisterHitTestTarget) verwendet werden, damit der Client WM/_POINTERDOWN - und DM/_POINTERHITTEST-Nachrichten in einen bestimmten Thread verschieben kann, um Treffertests zu ermöglichen.

Bemerkungen

In der Regel sendet Direct Manipulation nur WM/_POINTERDOWN - und DM/_POINTERHITTEST-Nachrichten an den UI-Thread, wobei spätere Nachrichten zurückbehalten werden, während auf eine Antwort vom Client gewartet wird. Wenn der Client SetContact aufruft, erhält der UI-Thread nur Nachrichten, wenn eine Manipulation erkannt wird, WM/_POINTERDOWN und DM/_POINTERHITTEST sowie WM/_POINTERCAPTURECHANGED Nachricht.

Der Client ruft SetContact möglicherweise nicht auf, wenn WM/_POINTERDOWN - und DM/_POINTERHITTEST-Nachrichten verarbeitet werden. In diesem Fall sendet direct Manipulation alle Nachrichten an den UI-Thread, ohne die Nachrichten zu analysieren, um festzustellen, ob eine Manipulation vorliegt. Der Client kann dann einen beliebigen Punkt auswählen, an dem SetContact aufgerufen werden soll, und die direkte Bearbeitung beginnt, Manipulationen zu erkennen und WM/_POINTERCAPTURECHANGED Nachrichten zu senden, wenn eine erkannt wird.

Windows 10 und höher: Sie können entscheiden, welche Manipulationen Sie verarbeiten möchten, indem Sie DeferContact aufrufen, bevor Sie SetContact für eine WM/_POINTERDOWN- oder DM/_POINTERHITTEST-Nachricht aufrufen. DeferContact stellt sicher, dass alle nachfolgenden Nachrichten für den angegebenen Zeitraum an den UI-Thread gesendet werden.