Share via


애플리케이션 문제 해결

이 섹션에서는 일반적인 문제에 대한 솔루션을 제공합니다.

일반적인 문제 해결

범주 설명
문제 Windows Server 2008을 실행하고 있으며 Windows Touch 기능이 작동하지 않습니다.
원인 데스크톱 환경을 사용하도록 설정하지 않았습니다.
솔루션 서버 관리자 관리 도구를 엽니다. 시작을 클릭하고 관리istrative Tools를 가리킨 다음 서버 관리자 클릭합니다. 왼쪽 열에서 기능 항목을 클릭합니다. 기능 섹션에서 기능 추가를 클릭합니다. 데스크톱 환경을 선택하고 다음을 클릭한 다음 설치를 클릭합니다.

 

범주 설명
문제 응용 프로그램에서 손가락을 빠르게 이동할 때마다 화살표가 나타나고 제스처 또는 조작이 제대로 등록되지 않습니다.
원인 필요하지 않을 때 영화를 사용하도록 설정합니다.
솔루션 사용 안 함으로 설정하려는 경우 영화를 사용할 수 있습니다. 펜 플릭을 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 스크롤 막대를 사용한 이동에 대한 레거시 지원을 참조하세요.

 

문제 마우스 입력과 Windows Touch 입력을 구분할 수 없습니다.
원인 Windows는 사용자가 화면을 클릭할 때 레거시 지원을 위한 마우스 메시지를 생성합니다.
솔루션 WM_LBUTTONDOWN GetMessageExtraInfo호출하고 메시지를 WM_LBUTTONUP 원본을 확인할 수 있습니다. 다음 코드는 이 작업을 수행하는 방법을 보여줍니다.

C++
#define MOUSEEVENTF_FROMTOUCH 0xFF515700 

if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) { // Click was generated by wisptis / Windows Touch }else{ // Click was generated by the mouse. }

 

범주 설명
문제 Windows 7에서 Microsoft PixelSense 애플리케이션을 실행할 어떻게 할까요? 있나요?
원인 Windows Touch 및 Microsoft PixelSense는 호환되지 않습니다.
솔루션 Windows 7 플랫폼 또는 Microsoft PixelSense 플랫폼을 대상으로 해야 합니다.

 

조작 및 관성 문제 해결

범주 설명
문제 아무 이유 없이 애플리케이션이 동결됩니다. 개체 인터페이스를 초기화할 때 액세스 위반이 발생합니다.
원인 IManipulationProcessor 또는 IInertiaProcessor 인터페이스를 사용할 때 CoInitialize 호출이 누락되었습니다.
솔루션 이는 CoInitialize를 호출하지 않고 WINDOWS TOUCH COM(구성 요소 개체 모델) 개체를 인스턴스화하여 발생할 수 있습니다. 이 문제는 프로젝트를 제스처 사용에서 조작 또는 관성 인터페이스 사용으로 변환하는 경우에 발생합니다.

 

범주 설명
문제 내 개체가 번역될 때 잘못 회전합니다. 한 손가락 회전이 제대로 작동하지 않습니다.
원인 개체에서 피벗을 잘못 설정합니다.
솔루션 조작 피벗 지점을 올바르게 설정하지 않습니다. PivotPointX PivotPointY 속성을 회전할 개체 또는 지점의 가운데로 설정하고 PivotRadius 속성을 개체의 반지름으로 설정합니다.

 

Windows Touch 입력 문제 해결

범주 설명
문제 WM_TOUCH 메시지를 처리한 후 경계 피드백 가져오기를 중지합니다.
원인 WM_TOUCH 메시지를 처리하지 않고 사용
솔루션 DefWindowProc에 전달하지 않고 Windows Touch 메시지를 사용할 수 있으므로 예기치 않은 동작이 발생할 수 있습니다. WM_TOUCH 메시지를 올바르게 처리하는 방법에 대한 자세한 내용은 Windows Touch 메시지 시작 확인

 

문제 windows.h를 포함하고 있지만 여전히 WM_TOUCH 정의되지 않았다고 말합니다.
원인 Targetver.h의 Windows 버전이 잘못되었습니다.
솔루션 프로젝트에서 올바른 Windows 버전을 설정하지 않았습니다. 다음 코드는 Windows 7에서 Windows Touch에 대해 올바르게 설정된 Windows 버전을 보여 줍니다.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

문제 터치 입력 x 좌표와 y 좌표가 잘못된 것 같습니다. 예상보다 큰 값이거나 음수 값입니다.
원인 터치 포인트를 픽셀로 변환해야 하거나 화면 좌표를 변환해야 할 수 있습니다.
솔루션 TOUCH_COORD_TO_PIXEL 및 ScreenToClient를 호출하는지 확인합니다. 다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.
C++
      POINT ptInput;
      if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
        for (int i=0; i < static_cast<INT>(cInputs); i++){
          TOUCHINPUT ti = pInputs[i];                       
          if (ti.dwID != 0){                
            // Do something with your touch input handle.
            ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
            ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
            ScreenToClient(hWnd, &ptInput);
            points[ti.dwID][0] = ptInput.x;
            points[ti.dwID][1] = ptInput.y;
          }
        }
      }

:
ScreenToClient 함수를 사용하려면 애플리케이션에서 높은 DPI 지원이 있어야 합니다. 높은 DPI 지원에 대한 자세한 내용은 MSDN의 High DPI 섹션을 참조하세요.

 

 

범주 설명
문제 WM_TOUCH 메시지가 표시되지 않지만 WM_GESTURE 메시지가 표시되므로 Windows Touch가 작동한다는 것을 알고 있습니다.
원인 RegisterTouchWindow에 대한 호출이 없습니다.
솔루션 WM_TOUCH 및 WM_GESTURE 메시지는 상호 배타적입니다. RegisterTouchWindow를 호출하지 않으면 WM_GESTURE 메시지만 받게 됩니다.

 

범주 설명
문제 손가락으로 터치할 때부터 애플리케이션에서 입력을 받을 때까지 약간의 지연이 발견되었습니다.
원인 팜 거부로 인해 입력이 지연됩니다.
솔루션 RegisterTouchWindow에 대한 호출에서 TWF_WANTPALM 설정되면 팜 거부가 사용됩니다. 이로 인해 소프트웨어에서 입력이 손가락, 펜 또는 사용자의 손바닥에서 오는지 여부를 테스트하는 동안 작은(100ms) 지연이 발생합니다. TWF_WANTPALM 플래그가 지워진 RegisterTouchWindow를 호출하여 팜 거부를 사용하지 않도록 설정합니다.

 

Windows 터치 제스처 문제 해결

범주 설명
문제 WM_GESTURE 메시지를 처리한 후 경계 피드백 가져오기를 중지합니다. 또는 이전에 작동했던 제스처가 지금 작동하지 않습니다.
원인 WM_GESTURE 메시지를 처리하지 않고 사용
솔루션 DefWindowProc에 전달하지 않고 Windows Touch 메시지를 사용할 수 있으므로 예기치 않은 동작이 발생할 수 있습니다. WM_GESTURE 메시지를 올바르게 처리하는 방법에 대한 자세한 내용은 Windows 제스처 시작 확인

 

범주 설명
문제 WM_GESTURE 메시지가 표시되지 않지만 WM_TOUCH 메시지가 표시되므로 Windows Touch가 작동한다는 것을 알고 있습니다.
원인 RegisterTouchWindow를 호출합니다.
솔루션 WM_TOUCH 및 WM_GESTURE 메시지는 상호 배타적입니다. RegisterTouchWindow를 호출하면 WM_GESTURE 메시지가 수신되지 않습니다.

 

문제 나는 내가 볼 것으로 예상되는 모든 제스처를 볼 수 없습니다. 예를 들어 식별자 GID_PAN 있는 제스처가 표시되지만 GID_ROTATE 않습니다.
원인 회전 제스처와 같은 일부 제스처는 기본적으로 사용하도록 설정되지 않습니다.
솔루션 WM_GESTURENOTIFY 참조에 설명된 대로 WM_GESTURENOTIFY 메시지를 받거나 WM_GESTURENOTIFY 메시지에 대한처리기를 추가해야 하는 경우 SetGestureConfig를 호출해야 합니다. 다음 코드에서는 회전을 지원하기 위해 처리기를 구현하는 방법을 보여 줍니다.

C++
메시지 맵입니다. BEGIN_MESSAGE_MAP() ON_WM_CREATE() ... ON_MESSAGE(WM_GESTURENOTIFY, OnWindowsGestureNotify) END_MESSAGE_MAP() 

LRESULT CTestWndApp::OnWindowsGestureNotify( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ){ GESTURECONFIG gc; gc.dwID = GID_ROTATE; // 제스처 식별자입니다. gc.dwWant = GC_ROTATE; GID_ROTATE 사용하도록 설정하는 제스처 명령입니다. gc.dwBlock = 0; 아무것도 차단하지 마십시오. UINT uiGcs = 1; 설정되는 제스처의 수입니다.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // 문제가 발생했습니다. 원하는 로깅을 사용하여 오류를 보고합니다. }

return 0; }

일반적인 제스처 구성에 대한 자세한 예제는 SetGestureConfig를 참조 하세요.

 

범주 설명
문제 이동 제스처를 수행할 때 애플리케이션의 사용자 지정 스크롤 막대가 스크롤되지 않습니다.
원인 올바른 WM_*SCROLL 메시지에 대한 처리기가 없습니다.
솔루션 사용자 지정 스크롤 막대에서 WM_*SCROLL 메시지를 모두 처리하지는 않습니다. 레거시 지원을 통해 사용자 지정 스크롤 막대 기능을 유지하는 대신 WM_GESTURE 메시지를 처리하는 것이 좋습니다. 스크롤 막대가 있는 이동에 대한 레거시 지원 섹션에 설명된 대로 메시지를 지원해야 합니다.

 

범주 설명
문제 제스처에 대한 지연이 있습니다.
원인 플리킹으로 인해 제스처가 지연될 수 있습니다.
솔루션 깜박임으로 인해 애플리케이션이 WM_GESTURE 메시지를 수신하는 데 걸리는 시간이 지연될 수 있습니다. 영화 사용 안 시에 대한 자세한 내용은 스크롤 막대를 사용한 이동에 대한 레거시 지원을 참조하세요.

 

프로그래밍 가이드