Verarbeiten von Eingaben mit DirectManipulation
Dieser Abschnitt bietet eine Übersicht über das Threadingmodell für die direkte Bearbeitung, die Verarbeitung von Fenstermeldungen durch die direkte Manipulation und die Art und Weise, wie sich der Zustand eines Viewports ändert, wenn die Eingabe Ausgabebewegungen zugeordnet wird.
Die direkte Bearbeitung verwendet zwei Threads, um asynchrone Vorgänge zu koordinieren:
UI-Thread: Der Thread, der das der Eingabe zugeordnete HWND besitzt. Dieser Thread besitzt die Initialisierung der direkten Bearbeitung. Die Verarbeitung von Maus- und Tastatureingaben erfolgt auch im UI-Thread.
Delegatthread: Der Thread, der erstellt wurde und sich im Besitz der direkten Bearbeitung befindet. Die Toucheingabeverarbeitung erfolgt im Delegatthread.
Eingabefluss
In einer typischen Konfiguration, bei der Treffertests für den UI-Thread durchgeführt werden, werden Fenstermeldungen von der direkten Bearbeitung in der folgenden Reihenfolge verarbeitet:

Für einen ruhenden Viewport:
- Eine Reihe von Fenstermeldungen erreicht den Delegatthread.
- WM_POINTERDOWN und DM_POINTERHITTEST werden vom Delegatthread an den IHT-Thread (Independent Hit Test) gesendet.
- Wenn SetContact aus dem IHT-Thread aufgerufen wird, werden Nachrichten möglicherweise vom Delegatthread an den UI-Thread gesendet, abhängig vom Wert von DIRECTMANIPULATION _ HITTEST _ TYPE beim Aufrufen von RegisterHitTestTarget.
- Wenn SetContact nicht aus dem IHT-Thread aufgerufen wird, werden Nachrichten immer vom Delegatthread an den UI-Thread gesendet.
- Der Client kann SetContact über den UI-Thread aufrufen, damit die direkte Bearbeitung eine Manipulation erkennen kann.
- Wenn eine Manipulation erkannt wird, sendet die direkte Manipulation eine WM/_POINTERCAPTURECHANGED-Nachricht, um den Client darüber zu informieren, dass die Eingabe von der direkten Bearbeitung verarbeitet wird. Der Viewportstatus ist auf RUNNING festgelegt, und die Ausgabetransformation wird aktualisiert.
- Wenn eine andere Interaktion als eine Manipulation erkannt wird, sendet die direkte Bearbeitung verbleibende Nachrichten an den UI-Thread.
Bei einem Viewport in Bewegung (mit dem Status RUNNING oder INERTIA) erreicht die Fenstermeldung zuerst den Delegatthread, bei dem die direkte Manipulation Treffertests für alle ausgeführten Viewports durchträgt. Die direkte Manipulation weist den Kontakt automatisch den entsprechenden Viewports zu, die durch Treffertests identifiziert werden. Der Viewportstatus ist RUNNING, und die Ausgabetransformation wird aktualisiert.
In einigen Fällen ist ein Thread der Anwendungsbenutzeroberfläche möglicherweise zu langsam, um auf Treffertests zu reagieren. Ein Treffertestthread kann verwendet werden (RegisterHitTestTarget), damit der Client WM/_POINTERDOWN- und DM/_POINTERHITTEST-Nachrichten in einen bestimmten Thread verschieben kann, um Treffertests zu ermöglichen.
Hinweise
In der Regel sendet die direkte 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 SetContactaufruft, empfängt der UI-Thread beim Erkennen einer Manipulation nur WM/_POINTERDOWN- und DM/_POINTERHITTEST-und WM/_POINTERCAPTURECHANGED-Nachricht.
Der Client kann SetContact bei der Verarbeitung von WM/_POINTERDOWN- und DM/_POINTERHITTEST-Nachrichten nicht aufrufen. In diesem Fall sendet die direkte Bearbeitung alle Nachrichten an den UI-Thread, ohne die Nachrichten zu analysieren, um zu prüfen, ob eine Bearbeitung vor liegt. Der Client kann dann einen beliebigen Punkt zum Aufrufen von SetContact auswählen und die direkte Bearbeitung damit beginnen lassen, Manipulationen zu erkennen und WM/_POINTERCAPTURECHANGED-Nachrichten zu senden, wenn eine solche erkannt wird.
Windows 10 und höher: Sie können entscheiden, welche Manipulationen Sie behandeln möchten, indem Sie DeferContact aufrufen, bevor Sie SetContact für eine WM/_POINTERDOWN- oder DM/_POINTERHITTEST aufrufen. DeferContact stellt sicher, dass alle nachfolgenden Nachrichten für den angegebenen Zeitraum an den UI-Thread gesendet werden.