DirectManipulation을 사용하여 입력 처리

이 섹션에서는 직접 조작 스레딩 모델, 직접 조작 으로 창 메시지를 처리하는 방법 및 입력이 출력 동작에 매핑될 때 뷰포트의 상태가 어떻게 변경되는지에 대한 개요를 제공합니다.

직접 조작 은 두 개의 스레드를 사용하여 비동기 작업을 조정합니다.

UI 스레드 - 입력과 연결된 HWND 를 소유하는 스레드입니다. 이 스레드는 직접 조작의 초기화를 소유합니다. 마우스 및 키보드 입력 처리는 UI 스레드에서도 발생합니다.

대리자 스레드 - 직접 조작에서 만들고 소유한 스레드입니다. 터치 입력 처리는 대리자 스레드에서 발생합니다.

입력 흐름

UI 스레드에서 적중 테스트가 수행되는 일반적인 구성에서는 창 메시지가 다음 순서로 직접 조작 에 의해 처리됩니다.

메시지가 처리되는 순서를 보여 주는 다이어그램

미사용 뷰포트의 경우:

  1. 일련의 창 메시지가 대리자 스레드에 도달합니다.
  2. WM_POINTERDOWNDM_POINTERHITTEST 메시지는 대리자 스레드에서 IHT(독립 적중 테스트) 스레드로 전송됩니다.
  3. SetContact가 IHT 스레드에서 호출되면 RegisterHitTestTarget이 호출되었을 때의 DIRECTMANIPULATION_HITTEST_TYPE 값에 따라 대리자 스레드가 메시지를 UI 스레드로 보낼 수 있습니다.
  4. SetContact가 IHT 스레드에서 호출되지 않으면 메시지는 항상 대리자 스레드에서 UI 스레드로 전송됩니다.
  5. 클라이언트는 UI 스레드에서 SetContact 를 호출하여 직접 조작 이 조작을 검색하도록 할 수 있습니다.
  6. 조작이 감지되면 직접 조작WM/_POINTERCAPTURECHANGED 메시지를 보내 입력이 직접 조작에 의해 처리되고 있음을 클라이언트에 알립니다. 뷰포트 상태 RUNNING으로 설정되고 출력 변환이 업데이트됩니다.
  7. 조작 이외의 상호 작용이 감지되면 직접 조작 은 나머지 메시지를 UI 스레드로 보냅니다.

실행 중 또는 INERTIA의 상태 사용하여 동작 중인 뷰포트의 경우 창 메시지가 대리자 스레드에 먼저 도달합니다. 여기서 직접 조작은 실행 중인 모든 뷰포트에 대해 테스트를 적중합니다. 직접 조작은 적중 테스트로 식별된 적절한 뷰포트에 연락처를 자동으로 할당합니다. 뷰포트 상태 실행 중이며 출력 변환이 업데이트됩니다.

경우에 따라 애플리케이션 UI 스레드가 적중 테스트에 응답하기에 너무 느릴 수 있습니다. 적중 테스트 스레드(RegisterHitTestTarget)를 사용하여 클라이언트가 WM/_POINTERDOWNDM/_POINTERHITTEST 메시지를 특정 스레드로 이동하여 적중 테스트를 허용할 수 있습니다.

설명

일반적으로 직접 조작WM/_POINTERDOWNDM/_POINTERHITTEST 메시지만 UI 스레드로 보내고 클라이언트의 응답을 기다리는 동안 이후 메시지를 보류합니다. 클라이언트가 SetContact를 호출하는 경우 조작이 감지될 때 UI 스레드가 수신하는 유일한 메시지는 WM/_POINTERDOWNDM/_POINTERHITTESTWM/_POINTERCAPTURECHANGED 메시지입니다.

클라이언트는 WM/_POINTERDOWN 및 DM/_POINTERHITTEST 메시지를 처리할 때 SetContact를 호출하지 않을 수 있습니다. 이 경우 직접 조작 은 메시지를 분석하지 않고 모든 메시지를 UI 스레드로 전송하여 조작이 있는지 확인합니다. 그런 다음 클라이언트는 SetContact 를 호출할 지점을 선택하고 직접 조작에서 조작 검색을 시작하고 검색되면 WM/_POINTERCAPTURECHANGED 메시지 메시지를 보낼 수 있습니다.

Windows 10 이상:WM/_POINTERDOWN 또는 DM/_POINTERHITTEST 메시지에서 SetContact를 호출하기 전에 DeferContact를 호출하여 처리할 조작을 결정할 수 있습니다. DeferContact 는 모든 후속 메시지가 지정된 기간 동안 UI 스레드로 전송되도록 합니다.