다음을 통해 공유


Windows Touch 메시지 시작

이 섹션에서는 애플리케이션에서 작동하도록 Windows Touch 입력을 가져오는 것과 관련된 작업을 설명합니다.

다음 단계는 일반적으로 Windows Touch 메시지로 작업할 때 수행됩니다.

  1. 입력 디지타이저의 기능을 테스트합니다.
  2. Windows Touch 메시지를 수신하도록 등록합니다.
  3. 메시지를 처리합니다.

Windows Touch 에 사용되는 메시지는 WM_TOUCH. 이 메시지는 디지타이저와의 다양한 접촉 상태를 나타냅니다.

입력 디지타이저의 기능 테스트

GetSystemMetrics 함수는 SM_DIGITIZER nIndex 값을 전달하여 입력 디지타이저의 기능을 쿼리하는 데 사용할 수 있습니다. GetSystemMetrics 는 디바이스가 준비되었는지 여부, 디바이스가 펜 또는 터치를 지원하는지 여부, 입력 디바이스가 통합되어 있는지 외부인지 여부, 디바이스가 여러 입력(Windows Touch)을 지원하는지 여부를 나타내는 비트 필드를 반환합니다. 다음 표에서는 다양한 필드의 비트를 보여 줍니다.

bit 8 7 6 5 4 3 2 1
스택 준비 다중 입력 예약됨 예약됨 외부 펜 통합 펜 외부 터치 통합 터치

 

특정 기능에 대한 명령의 결과를 테스트하려면 비트 연산자 및 테스트 중인 특정 비트를 사용할 수 있습니다. 예를 들어 Windows Touch를 테스트하려면 7번째 순서 비트가 설정되어 있는지 테스트합니다(16진수로 0x40). 다음 코드 예제에서는 이러한 값을 테스트할 수 있는 방법을 보여줍니다.

#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value  & NID_MULTI_INPUT){
    /* digitizer is multitouch */ 
    MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}

다음 표에는 입력 디지타이저의 터치 기능을 테스트하기 위해 windows.h에 정의된 상수가 나와 있습니다.

속성 설명
TABLET_CONFIG_NONE 0x00000000 입력 디지타이저에는 터치 기능이 없습니다.
NID_INTEGRATED_TOUCH 0x00000001 통합 터치 디지타이저가 입력에 사용됩니다.
NID_EXTERNAL_TOUCH 0x00000002 외부 터치 디지타이저가 입력에 사용됩니다.
NID_INTEGRATED_PEN 0x00000004 통합 펜 디지타이저가 입력에 사용됩니다.
NID_EXTERNAL_PEN 0x00000008 외부 펜 디지타이저가 입력에 사용됩니다.
NID_MULTI_INPUT 0x00000040 여러 입력을 지원하는 입력 디지타이저가 입력에 사용됩니다.
NID_READY 0x00000080 입력 디지타이저가 입력할 준비가 되었습니다. 이 값이 설정되지 않은 경우 태블릿 서비스가 중지되거나 디지타이저가 지원되지 않거나 디지타이저 드라이버가 설치되지 않은 것일 수 있습니다.

 

NID_* 값을 확인하는 것은 터치, 펜 또는 태블릿이 아닌 입력을 위해 애플리케이션을 구성하기 위해 사용자 컴퓨터의 기능을 검사 유용한 방법입니다. 예를 들어 UI(동적 사용자 인터페이스)가 있고 그 중 일부를 자동으로 구성하려는 경우 NID_INTEGRATED_TOUCH NID_MULTITOUCH 대한 검사 사용자가 애플리케이션을 처음 실행할 때 최대 터치 수를 가져올 수 있습니다.

참고 항목

SM_GETSYSTEMMETRICS 몇 가지 내재된 제한 사항이 있습니다. 예를 들어 플러그 앤 플레이는 지원되지 않습니다. 이러한 이유로 이 함수를 영구 구성을 위한 수단으로 사용할 때는 주의해야 합니다.

 

Windows Touch 입력 수신에 등록

Windows Touch 입력을 받기 전에 애플리케이션은 먼저 Windows Touch 입력을 수신하도록 등록해야 합니다. 애플리케이션 창을 등록하면 애플리케이션이 터치 호환임을 나타냅니다. 애플리케이션이 창을 등록하면 창에서 입력이 수행될 때 Windows Touch 드라이버의 알림이 애플리케이션으로 전달됩니다. 애플리케이션이 종료되면 해당 창의 등록을 취소하여 알림을 사용하지 않도록 설정합니다.

참고 항목

WM_TOUCH 메시지는 현재 "탐욕"입니다. 창에서 첫 번째 터치 메시지를 받은 후 다른 창이 포커스를 받을 때까지 모든 터치 메시지가 해당 창으로 전송됩니다.

 

참고 항목

기본적으로 WM_TOUCH 메시지 대신 WM_GESTURE 메시지를 받습니다. RegisterTouchWindow를 호출하는 경우 WM_GESTURE 메시지 수신을 중지합니다.

 

다음 코드는 애플리케이션이 Win32 애플리케이션에서 Windows Touch 메시지를 수신하도록 등록하는 방법을 보여 줍니다.

RegisterTouchWindow(hWnd, 0);

Windows 터치 메시지 처리

여러 가지 방법으로 Windows 운영 체제의 애플리케이션에서 Windows Touch 메시지를 처리할 수 있습니다. GUI 애플리케이션을 프로그래밍하는 경우 함수 내에 WndProc 코드를 추가하여 관심 있는 메시지를 처리합니다. MFC(Microsoft Foundation Class) 또는 관리되는 애플리케이션을 프로그래밍하는 경우 관심 있는 메시지에 대한 처리기를 추가합니다. 다음 코드 예제에서는 Windows 기반 애플리케이션에서 WndProc에서 터치 메시지를 처리할 수 있는 방법을 보여 줍니다.

  LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
    BOOL bHandled = FALSE;
    UINT cInputs = LOWORD(wParam);
    PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
    if (pInputs){
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
            for (UINT i=0; i < cInputs; i++){
                TOUCHINPUT ti = pInputs[i];
                //do something with each touch input entry
            }            
            bHandled = TRUE;
        }else{
             /* handle the error here */
        }
        delete [] pInputs;
    }else{
        /* handle the error here, probably out of memory */
    }
    if (bHandled){
        // if you handled the message, close the touch input handle and return
        CloseTouchInputHandle((HTOUCHINPUT)lParam);
        return 0;
    }else{
        // if you didn't handle the message, let DefWindowProc handle it
        return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
    }
  }


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
      // pass touch messages to the touch handler 
      case WM_TOUCH:
        OnTouch(hWnd, wParam, lParam);
        break;

다음 코드에서는 메시지 맵 및 메시지 처리기를 구현하는 방법을 보여 있습니다. 메시지 맵에서 메시지를 선언한 다음 메시지 처리기를 구현해야 합니다. 예를 들어 MFC 애플리케이션에서는 대화 상자 코드에서 이를 선언할 수 있습니다. 또한 대화 상자 창의 OnInitDialog 함수에는 RegisterTouchWindow에 대한 호출(예: RegisterTouchWindow(m_hWnd, 0).)이 포함되어야 합니다.

  // Class implementations within a dialog
  LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
    //Insert handler code here to do something with the message or uncomment the following line to test
    //MessageBox(L"touch!", L"touch!", MB_OK);
    return 0;
  }
  // The message map
  BEGIN_MESSAGE_MAP()
    ON_WM_CREATE()
    ... ... ...
    ON_MESSAGE(WM_TOUCH, OnTouch)
  END_MESSAGE_MAP()  
 
  BOOL TestDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();    

    RegisterTouchWindow(m_hWnd, 0);
     ... ... ...
  }  
  

창을 터치하면 팝업 창의 터치가 표시됩니다.

Windows 터치 입력