Partilhar via


Processamento de entrada com DirectManipulation

Esta seção fornece uma visão geral do modelo de threading de Manipulação Direta , como as mensagens de janela são processadas pela Manipulação Direta e como o estado de um visor muda à medida que a entrada é mapeada para movimentos de saída.

A Manipulação Direta usa dois threads para coordenar operações assíncronas:

Thread de interface do usuário – o thread que possui o HWND associado à entrada. Esse thread possui a inicialização da Manipulação Direta. O processamento de entrada de mouse e teclado também acontece no thread da interface do usuário.

Thread delegado – o thread criado e de propriedade da Manipulação Direta. O processamento de entrada por toque ocorre no thread delegado.

Fluxo de entrada

Em uma configuração típica em que o teste de clique é feito no thread da interface do usuário, as mensagens de janela são processadas pela Manipulação Direta na seguinte ordem:

diagrama mostrando a ordem na qual as mensagens são processadas.

Para um visor em repouso:

  1. Uma série de mensagens de janela atingem o thread delegado.
  2. WM_POINTERDOWN e DM_POINTERHITTEST mensagens são enviadas pelo thread delegado para o thread IHT (Teste de Ocorrência Independente).
  3. Se SetContact for chamado do thread IHT, as mensagens poderão ser enviadas para o thread da interface do usuário pelo thread delegado, dependendo do valor de DIRECTMANIPULATION_HITTEST_TYPE quando RegisterHitTestTarget foi chamado.
  4. Se SetContact não for chamado do thread IHT, as mensagens sempre serão enviadas pelo thread delegado para o thread da interface do usuário.
  5. O cliente pode chamar SetContact do thread de interface do usuário para permitir que a Manipulação Direta detecte uma manipulação.
  6. Se uma manipulação for detectada, a Manipulação Direta enviará uma mensagem WM/_POINTERCAPTURECHANGED para notificar o cliente de que a entrada está sendo manipulada pela Manipulação Direta. O visor status está definido como RUNNING e a transformação de saída será atualizada.
  7. Se uma interação diferente de uma manipulação for detectada, a Manipulação Direta enviará mensagens restantes para o thread da interface do usuário.

Para um visor em movimento (com um status de RUNNING ou INERTIA), a mensagem de janela atinge primeiro o thread delegado, em que a Manipulação Direta atinge testes em todos os visores em execução. A Manipulação Direta atribui automaticamente o contato aos visores apropriados identificados pelo teste de ocorrência. O visor status é RUNNING e a transformação de saída será atualizada.

Em alguns casos, um thread de interface do usuário do aplicativo pode ser muito lento para responder ao teste de ocorrência. Um thread de teste de ocorrência pode ser usado (RegisterHitTestTarget) para permitir que o cliente mova mensagens WM/_POINTERDOWN e DM/_POINTERHITTEST para um thread específico para permitir o teste de clique.

Comentários

Normalmente, a Manipulação Direta envia apenas mensagens WM/_POINTERDOWN e DM/_POINTERHITTEST para o thread da interface do usuário, retendo mensagens posteriores enquanto aguarda uma resposta do cliente. Se o cliente chamar SetContact, as únicas mensagens que o thread da interface do usuário receberá quando uma manipulação for detectada serão WM/_POINTERDOWN e DM/_POINTERHITTEST e mensagem WM/_POINTERCAPTURECHANGED.

O cliente pode não chamar SetContact ao processar mensagens WM/_POINTERDOWN e DM/_POINTERHITTEST . Nesse caso, a Manipulação Direta envia todas as mensagens para o thread da interface do usuário sem analisar as mensagens para ver se há uma manipulação. Em seguida, o cliente pode escolher qualquer ponto para chamar SetContact e fazer com que a Manipulação Direta comece a detectar manipulações e enviar mensagens de mensagem WM/_POINTERCAPTURECHANGED quando uma for detectada.

Windows 10 e posterior: você pode decidir quais manipulações deseja manipular chamando DeferContact antes de chamar SetContact em uma mensagem WM/_POINTERDOWN ou DM/_POINTERHITTEST. DeferContact garante que todas as mensagens subsequentes sejam enviadas para o thread da interface do usuário pelo período de tempo especificado.