Compartir a través de


Introducción con mensajes táctiles de Windows

En esta sección se explican las tareas asociadas a la obtención de la entrada de Windows Touch para funcionar en la aplicación.

Normalmente, los pasos siguientes se realizan al trabajar con mensajes de Windows Touch:

  1. Pruebe las funcionalidades del digitalizador de entrada.
  2. Regístrese para recibir mensajes de Windows Touch.
  3. Controle los mensajes.

El mensaje usado para Windows Touch es WM_TOUCH. Este mensaje indica los distintos estados de contacto con un digitalizador.

Probar las funcionalidades del digitalizador de entrada

La función GetSystemMetrics se puede usar para consultar las funcionalidades del digitalizador de entrada pasando el valor nIndex de SM_DIGITIZER. GetSystemMetrics devuelve un campo de bits que indica si el dispositivo está listo, si el dispositivo admite lápiz o entrada táctil, si el dispositivo de entrada está integrado o externo, y si el dispositivo admite varias entradas (Windows Touch). En la tabla siguiente se muestran los bits de los distintos campos.

bit 8 7 6 5 4 3 2 1
Valor Stack Ready Entrada múltiple Reservado Reservado Lápiz externo Lápiz integrado Entrada táctil externa Entrada táctil integrada

 

Para probar el resultado del comando para una característica determinada, puede usar el operador bit a bit & y el bit concreto que está probando. Por ejemplo, para probar Windows Touch, probaría que se establece el séptimo bit de orden (0x40 en hexadecimal). En el ejemplo de código siguiente se muestra cómo se podrían probar estos valores.

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

En la tabla siguiente se enumeran las constantes definidas en windows.h para probar las funcionalidades táctiles del digitalizador de entrada.

Nombre Valor Descripción
TABLET_CONFIG_NONE 0x00000000 El digitalizador de entrada no tiene funcionalidades táctiles.
NID_INTEGRATED_TOUCH 0x00000001 Se usa un digitalizador táctil integrado para la entrada.
NID_EXTERNAL_TOUCH 0x00000002 Se usa un digitalizador táctil externo para la entrada.
NID_INTEGRATED_PEN 0x00000004 Se usa un digitalizador de lápiz integrado para la entrada.
NID_EXTERNAL_PEN 0x00000008 Se usa un digitalizador de lápiz externo para la entrada.
NID_MULTI_INPUT 0x00000040 Se usa un digitalizador de entrada compatible con varias entradas para la entrada.
NID_READY 0x00000080 El digitalizador de entrada está listo para la entrada. Si este valor no está configurado, puede significar que se detiene el servicio de tableta, no se admite el digitalizador o no se han instalado controladores de digitalizador.

 

Comprobar los valores de NID_* es una forma útil de comprobar las funcionalidades del equipo de un usuario para configurar la aplicación para la entrada táctil, lápiz o no tableta. Por ejemplo, si tiene una interfaz de usuario (UI) dinámica y desea configurar automáticamente parte de ella, puede comprobar si hay NID_INTEGRATED_TOUCH, NID_MULTITOUCH y podría obtener el número máximo de toques la primera vez que un usuario ejecuta la aplicación.

Nota

Hay algunas limitaciones inherentes para SM_GETSYSTEMMETRICS. Por ejemplo, no hay compatibilidad con plug and play. Por este motivo, tenga cuidado al usar esta función como medio para la configuración permanente.

 

Registro para recibir entrada táctil de Windows

Antes de recibir la entrada de Windows Touch, las aplicaciones deben registrarse para recibir la entrada de Windows Touch. Al registrar la ventana de la aplicación, la aplicación indica que es compatible con la función táctil. Una vez que la aplicación registra su ventana, las notificaciones del controlador Windows Touch se reenvía a la aplicación cuando se realiza la entrada en la ventana. Cuando la aplicación se cierra, anula el registro de su ventana para deshabilitar las notificaciones.

Nota

WM_TOUCH mensajes son actualmente "expansos". Después de recibir el primer mensaje táctil en una ventana, todos los mensajes táctiles se envían a esa ventana hasta que otra ventana recibe el foco.

 

Nota

De forma predeterminada, recibirá WM_GESTURE mensajes en lugar de WM_TOUCH mensajes. Si llamas a RegisterTouchWindow, dejarás de recibir WM_GESTURE mensajes.

 

En el código siguiente se muestra cómo una aplicación podría registrarse para recibir mensajes de Windows Touch en una aplicación Win32.

RegisterTouchWindow(hWnd, 0);

Control de mensajes táctiles de Windows

Puedes controlar los mensajes de Windows Touch desde aplicaciones en sistemas operativos Windows de muchas maneras. Si va a programar una aplicación de GUI, agregue código dentro de la WndProc función para controlar los mensajes de interés. Si va a programar una aplicación administrada o microsoft Foundation Class (MFC), agregue controladores para los mensajes de interés. En el ejemplo de código siguiente se muestra cómo se pueden controlar los mensajes táctiles desde WndProc en una aplicación basada en 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;

En el código siguiente se muestra cómo puede implementar el mapa de mensajes y un controlador de mensajes. Tenga en cuenta que los mensajes deben declararse en el mapa de mensajes y, a continuación, el controlador del mensaje debe implementarse. Por ejemplo, en una aplicación MFC, esto podría declararse en el código del cuadro de diálogo. Tenga en cuenta también que la función de la OnInitDialog ventana del cuadro de diálogo tendría que incluir una llamada a 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);
     ... ... ...
  }  
  

Al tocar la ventana, se indicarán los toques de una ventana emergente.

Entrada táctil de Windows