Partager via


Traitement de l’entrée avec DirectManipulation

Cette section fournit une vue d’ensemble du modèle de thread de manipulation directe , de la façon dont les messages de fenêtre sont traités par La manipulation directe et de la façon dont l’état d’une fenêtre d’affichage change à mesure que l’entrée est mappée aux mouvements de sortie.

La manipulation directe utilise deux threads pour coordonner les opérations asynchrones :

Thread d’interface utilisateur : thread qui possède le HWND associé à l’entrée. Ce thread est propriétaire de l’initialisation de la manipulation directe. Le traitement des entrées de souris et de clavier se produit également sur le thread d’interface utilisateur.

Thread délégué : thread créé et détenu par Direct Manipulation. Le traitement de l’entrée tactile se produit sur le thread délégué.

Flux d’entrée

Dans une configuration classique où le test d’accès est effectué sur le thread d’interface utilisateur, les messages de fenêtre sont traités par Manipulation directe dans l’ordre suivant :

diagramme montrant l’ordre dans lequel les messages sont traités.

Pour une fenêtre d’affichage au repos :

  1. Une série de messages de fenêtre atteignent le thread délégué.
  2. WM_POINTERDOWN et les messages DM_POINTERHITTEST sont envoyés par le thread délégué au thread IHT (Independent Hit Test).
  3. Si SetContact est appelé à partir du thread IHT, des messages peuvent être envoyés au thread d’interface utilisateur par le thread délégué, en fonction de la valeur de DIRECTMANIPULATION_HITTEST_TYPE lorsque RegisterHitTestTarget a été appelé.
  4. Si SetContact n’est pas appelé à partir du thread IHT, les messages sont toujours envoyés par le thread délégué au thread d’interface utilisateur.
  5. Le client peut appeler SetContact à partir du thread d’interface utilisateur pour permettre à Direct Manipulation de détecter une manipulation.
  6. Si une manipulation est détectée, La manipulation directe envoie un message WM/_POINTERCAPTURECHANGED pour informer le client que l’entrée est gérée par La manipulation directe. La fenêtre d’affichage status est définie sur RUNNING et la transformation de sortie est mise à jour.
  7. Si une interaction autre qu’une manipulation est détectée, La manipulation directe envoie les messages restants au thread d’interface utilisateur.

Pour une fenêtre d’affichage en mouvement (avec un status d’EXÉCUTION ou d’INERTIE), le message de fenêtre atteint d’abord le thread délégué, où La manipulation directe atteint des tests par rapport à toutes les fenêtres d’affichage en cours d’exécution. La manipulation directe affecte automatiquement le contact aux fenêtres d’affichage appropriées identifiées par le test d’accès. La fenêtre d’affichage status est EN COURS D’EXÉCUTION et la transformation de sortie est mise à jour.

Dans certains cas, un thread d’interface utilisateur d’application peut être trop lent pour répondre aux tests d’accès. Un thread de test de succès peut être utilisé (RegisterHitTestTarget) pour permettre au client de déplacer des messages WM/_POINTERDOWN et DM/_POINTERHITTEST vers un thread spécifique afin de permettre le test d’accès.

Notes

En règle générale, la manipulation directe envoie uniquement les messages WM/_POINTERDOWN et DM/_POINTERHITTEST au thread d’interface utilisateur, en retenant les messages ultérieurs en attendant une réponse du client. Si le client appelle SetContact, les seuls messages que le thread d’interface utilisateur reçoit lorsqu’une manipulation est détectée sont WM/_POINTERDOWN et DM/_POINTERHITTEST, et WM/_POINTERCAPTURECHANGED message.

Le client peut ne pas appeler SetContact lors du traitement des messages WM/_POINTERDOWN et DM/_POINTERHITTEST . Dans ce cas, La manipulation directe envoie tous les messages au thread d’interface utilisateur sans analyser les messages pour voir s’il y a une manipulation. Le client peut ensuite choisir n’importe quel point pour appeler SetContact . Direct Manipulation commence à détecter les manipulations et envoie des messages WM/_POINTERCAPTURECHANGED lorsqu’un message est détecté.

Windows 10 et versions ultérieures : vous pouvez décider des manipulations à gérer en appelant DeferContact avant d’appeler SetContact sur un message WM/_POINTERDOWN ou DM/_POINTERHITTEST. DeferContact garantit que tous les messages suivants sont envoyés au thread d’interface utilisateur pendant la période spécifiée.