Partilhar via


Introdução às Mensagens de Toque do Windows

Esta seção explica as tarefas associadas a fazer com que a entrada do Windows Touch funcione em seu aplicativo.

As etapas a seguir geralmente são executadas ao trabalhar com mensagens do Windows Touch:

  1. Teste as capacidades do digitalizador de entrada.
  2. Registe-se para receber mensagens do Windows Touch.
  3. Manipule as mensagens.

A mensagem usada para o Windows Touch é WM_TOUCH. Esta mensagem indica os vários estados de contato com um digitalizador.

Testando os recursos do digitalizador de entrada

A função GetSystemMetrics pode ser usada para consultar as capacidades do digitalizador de entrada ao passar o valor nIndex de SM_DIGITIZER. GetSystemMetrics retorna um campo de bit que indica se o dispositivo está pronto, se o dispositivo suporta caneta ou toque, se o dispositivo de entrada é integrado ou externo e se o dispositivo suporta várias entradas (Windows Touch). A tabela a seguir mostra os bits para os vários campos.

Pouco 8 7 6 5 4 3 2 1
Valor Pronto para pilha Entrada múltipla Reservado Reservado Caneta externa Caneta integrada Toque Externo Toque integrado

 

Para testar o resultado do comando para um recurso específico, você pode usar o operador bit a bit & e o bit específico que está testando. Por exemplo, para testar o Windows Touch, você deve testar se o bit de sétima ordem está definido (0x40 em hex). O exemplo de código a seguir mostra como esses valores podem ser testados.

#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 */}

A tabela a seguir lista as constantes definidas em windows.h para testar os recursos de toque do digitalizador de entrada.

Nome Valor Descrição
CONFIGURAÇÃO_DO_TABLET_NENHUMA 0x00000000 O digitalizador de entrada não tem recursos de toque.
NID_INTEGRATED_TOUCH 0x00000001 Um digitalizador de toque integrado é usado para entrada.
NID_EXTERNAL_TOUCH 0x00000002 Um digitalizador de toque externo é usado para entrada.
NID_INTEGRATED_PEN 0x00000004 Um digitalizador de caneta integrado é usado para entrada.
NID_EXTERNAL_PEN 0x00000008 Um digitalizador de caneta externo é usado para entrada.
NID_MULTI_INPUT 0x00000040 Um digitalizador de entrada com suporte para várias entradas é usado para entrada.
NID_READY 0x00000080 O digitalizador de entrada está pronto para receber entradas. Se esse valor for desdefinido, isso pode significar que o serviço de tablet está parado, o digitalizador não é suportado ou os drivers do digitalizador não foram instalados.

 

Verificar os valores de NID_* é uma maneira útil de analisar as capacidades do computador de um utilizador para configurar a sua aplicação para entrada por toque, caneta ou não tátil. Por exemplo, se você tiver uma interface do usuário (UI) dinâmica e quiser configurar automaticamente parte dela, poderá verificar se há NID_INTEGRATED_TOUCH, NID_MULTITOUCH e poderá obter o número máximo de toques na primeira vez que um usuário executar seu aplicativo.

Observação

Existem algumas limitações inerentes à SM_GETSYSTEMMETRICS. Por exemplo, não há suporte para plug and play. Por esta razão, tenha cuidado ao usar esta função como um meio para configuração permanente.

 

Registrando-se para receber a entrada do Windows Touch

Antes de receber a entrada do Windows Touch, os aplicativos devem primeiro se registrar para receber a entrada do Windows Touch. Ao registrar a janela do aplicativo, o aplicativo indica que é compatível com toque. Depois que o aplicativo registra sua janela, as notificações do driver do Windows Touch são encaminhadas para o aplicativo quando a entrada é feita na janela. Quando o aplicativo é desligado, ele cancela o registro de sua janela para desativar as notificações.

Observação

WM_TOUCH mensagens são, neste momento, "gananciosas". Quando a primeira mensagem tátil é recebida numa janela, todas as mensagens tácteis são enviadas para essa janela até que outra janela receba o foco.

 

Observação

Por padrão, você recebe mensagens WM_GESTURE em vez de mensagens WM_TOUCH. Se chamares RegisterTouchWindow, deixarás de receber mensagens de WM_GESTURE.

 

O código a seguir demonstra como um aplicativo pode se registrar para receber mensagens do Windows Touch em um aplicativo Win32.

RegisterTouchWindow(hWnd, 0);

Manipulando mensagens do Windows Touch

Você pode lidar com as mensagens do Windows Touch de aplicativos em sistemas operacionais Windows de várias maneiras. Se você estiver programando um aplicativo GUI, você adiciona código dentro da função WndProc para lidar com as mensagens de interesse. Se você estiver programando um Microsoft Foundation Class (MFC) ou aplicativo gerenciado, você adiciona manipuladores para as mensagens de interesse. O exemplo de código a seguir mostra como as mensagens de toque podem ser tratadas a partir de WndProc em um aplicativo baseado no Windows.

  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;

O código a seguir mostra como você pode implementar o mapa de mensagens e um manipulador de mensagens. Observe que as mensagens devem ser declaradas no mapa de mensagens e, em seguida, o manipulador para a mensagem deve ser implementado. Por exemplo, em um aplicativo MFC, isso pode ser declarado no código de diálogo. Observe também que a função OnInitDialog para sua janela de diálogo teria que incluir uma chamada para RegisterTouchWindow como 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);
     ... ... ...
  }  
  

Tocar a janela indicará toques vindos de uma janela pop-up.

Entrada por Toque do Windows