Compartir a través de


Solución de problemas de aplicaciones

En esta sección se proporcionan soluciones a problemas comunes.

Solución general de problemas

Category Descripción
Problema Estoy ejecutando Windows Server 2008 y las características de Windows Touch no funcionan.
Causa No he habilitado la experiencia de escritorio.
Solución Abra la herramienta administrativa Administrador del servidor: haga clic en Inicio, seleccione Herramientas administrativas y, a continuación, haga clic en Administrador del servidor. Haga clic en el elemento Características de la columna izquierda. Haga clic en Agregar características en la sección Características. Seleccione Experiencia de escritorio, haga clic en Siguiente y, a continuación, haga clic en Instalar.

 

Category Descripción
Problema Cada vez que muevo el dedo rápidamente sobre mi aplicación, aparece una flecha y mi gesto o manipulación no se registra correctamente.
Causa Parpadeos habilitados cuando no los necesita.
Solución Tiene los parpadeos habilitados cuando quiere que estén deshabilitados. Consulte Compatibilidad heredada con el movimiento panorámico con barras de desplazamiento para obtener información sobre cómo deshabilitar los parpadeos de lápiz.

 

Problema No puedo distinguir entre la entrada del mouse y la entrada de Windows Touch.
Causa Windows genera mensajes del mouse para la compatibilidad heredada cuando un usuario hace clic en la pantalla.
Solución Puede llamar a GetMessageExtraInfo para los mensajes WM_LBUTTONDOWN y WM_LBUTTONUP para determinar el origen. En el código siguiente se muestra cómo se puede hacer esto.

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. }

 

Category Descripción
Problema Cómo ejecuto aplicaciones de Microsoft PixelSense en Windows 7?
Causa Windows Touch y Microsoft PixelSense no son compatibles.
Solución Debe tener como destino la plataforma Windows 7 o la plataforma Microsoft PixelSense.

 

Solución de problemas de manipulaciones e inercia

Category Descripción
Problema Mi solicitud se congela sin motivo. Obtengo infracciones de acceso al inicializar mis interfaces de objeto.
Causa Falta una llamada a CoInitialize al usar las interfaces IManipulationProcessor o IInertiaProcessor.
Solución Esto podría deberse a la creación de instancias de los objetos del Modelo de objetos de componente de Windows Touch (COM) sin llamar a CoInitialize. Esto sucede a veces cuando se convierten proyectos a partir del uso de gestos para usar las interfaces de manipulaciones o de inercia.

 

Category Descripción
Problema Mi objeto gira incorrectamente cuando se traduce. La rotación de un solo dedo no funciona correctamente.
Causa Se establecen incorrectamente los pivotes en un objeto.
Solución No está configurando correctamente los puntos dinámicos de manipulación. Establezca las propiedades PivotPointX y PivotPointY en el centro del objeto o punto alrededor del cual desea girar y establezca la propiedad PivotRadius en el radio del objeto.

 

Solución de problemas de entrada de Windows Touch

Category Descripción
Problema Después de controlar el mensaje de WM_TOUCH, dejo de recibir comentarios de límites.
Causa Consumir el mensaje de WM_TOUCH sin controlarlo.
Solución Probablemente esté consumiendo un mensaje de Windows Touch sin reenviarlo a DefWindowProc, lo que provocará un comportamiento inesperado. Consulte Introducción a mensajes de Windows Touch para obtener más información sobre cómo controlar correctamente los mensajes de WM_TOUCH.

 

Problema Estoy incluyendo windows.h, pero sigue diciendo que WM_TOUCH no está definido.
Causa La versión de Windows en Targetver.h es incorrecta.
Solución No ha establecido la versión correcta de Windows en el proyecto. En el código siguiente se muestran las versiones de Windows establecidas correctamente para Windows Touch en Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problema Mis coordenadas x e y de entrada táctil parecen no ser válidas. Son valores mayores de los esperados o valores negativos.
Causa Es posible que tenga que convertir los puntos táctiles a píxeles, o puede que tenga que convertir las coordenadas de la pantalla.
Solución Asegúrese de llamar a TOUCH_COORD_TO_PIXEL y ScreenToClient. El código siguiente muestra cómo hacerlo.
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;
          }
        }
      }

Nota:
Para usar la función ScreenToClient, debe tener compatibilidad con valores altos de PPP en la aplicación. Para obtener más información sobre cómo admitir valores altos de PPP, consulte High PPP (Valores altos de PPP).

 

 

Category Descripción
Problema No veo mensajes WM_TOUCH, pero sé que Windows Touch funciona porque veo mensajes WM_GESTURE.
Causa Falta una llamada a RegisterTouchWindow.
Solución Los mensajes de WM_TOUCH y WM_GESTURE son mutuamente excluyentes. Si no llama a RegisterTouchWindow, solo recibirá mensajes de WM_GESTURE.

 

Category Descripción
Problema Estoy notando pequeños retrasos desde el momento en que toco con el dedo hacia abajo hasta que recibo la entrada en mi aplicación.
Causa El rechazo de la palma está causando retrasos en la entrada.
Solución Si TWF_WANTPALM se establece en llamadas a RegisterTouchWindow, el rechazo de la palma está habilitado. Esto provoca un retraso pequeño (100 ms) mientras el software comprueba si la entrada procede de un dedo, un lápiz o la palma del usuario. Deshabilite el rechazo de palma llamando a RegisterTouchWindow con la marca TWF_WANTPALM desactivada.

 

Solución de problemas de gestos de Windows Touch

Category Descripción
Problema Después de controlar el mensaje de WM_GESTURE, dejo de recibir comentarios de límites. O bien, un gesto que funcionó anteriormente ahora ya no funciona.
Causa Consumir el mensaje de WM_GESTURE sin controlarlo.
Solución Probablemente esté consumiendo un mensaje de Windows Touch sin reenviarlo a DefWindowProc, lo que provocará un comportamiento inesperado. Consulte Introducción a los gestos de Windows para obtener más información sobre cómo controlar correctamente los mensajes de WM_GESTURE.

 

Category Descripción
Problema No veo mensajes de WM_GESTURE, pero sé que Windows Touch funciona porque veo mensajes de WM_TOUCH.
Causa Llamar a RegisterTouchWindow.
Solución Los mensajes de WM_TOUCH y WM_GESTURE son mutuamente excluyentes. Si llama a RegisterTouchWindow, no recibirá mensajes de WM_GESTURE.

 

Problema No veo todos los gestos que espero ver. Por ejemplo, veo gestos con el identificador GID_PAN, pero no GID_ROTATE.
Causa Algunos gestos, como el gesto de rotación, no están habilitados de forma predeterminada.
Solución Debe llamar a SetGestureConfig cuando reciba un mensaje de WM_GESTURENOTIFY, tal como se describe en la referencia de WM_GESTURENOTIFY, o bien agregar un controlador para el mensaje de WM_GESTURENOTIFY. En el código siguiente se muestra cómo se podría implementar un controlador para habilitar la compatibilidad con la rotación.

C++
// El mapa de mensajes. 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; // El identificador de gesto. gc.dwWant = GC_ROTATE; // El comando de gesto que está habilitando para GID_ROTATE. gc.dwBlock = 0; // No bloquees nada. UINT uiGcs = 1; // Número de gestos que se establecen.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Algo salió mal, notifique el error con el registro preferido. }

return 0; }

Para obtener más ejemplos de configuraciones de gestos típicas, consulte SetGestureConfig.

 

Category Descripción
Problema Las barras de desplazamiento personalizadas de mi aplicación no se desplazan al realizar el gesto panorámico.
Causa Faltan controladores para los mensajes de WM_*SCROLL correctos.
Solución No controla todos los mensajes de WM_*SCROLL en las barras de desplazamiento personalizadas. Se recomienda controlar el mensaje de WM_GESTURE en lugar de conservar la funcionalidad de barra de desplazamiento personalizada a través de la compatibilidad heredada. Debe admitir mensajes como se detalla en la sección Compatibilidad heredada para movimiento panorámico con barras de desplazamiento.

 

Category Descripción
Problema Obtengo retrasos en los gestos.
Causa Los parpadeos pueden estar causando retrasos en los gestos.
Solución Los parpadeos pueden provocar retrasos por el tiempo que tarda la aplicación en recibir mensajes de WM_GESTURE. Consulte Compatibilidad heredada con el movimiento panorámico con barras de desplazamiento para obtener información sobre cómo deshabilitar los parpadeos.

 

Guía de programación