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
Incidencia Estoy ejecutando las características de Windows Server 2008 y Windows Touch no funcionan.
Causa No ha 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 Siguientey, a continuación, haga clic en Instalar.

 

Category Descripción
Incidencia Cada vez que mué el dedo rápidamente a través de mi aplicación, aparece una flecha y mi gesto o manipulación no se registra correctamente.
Causa Tener parpadeos habilitados cuando no lo necesite.
Solución Tienes parpadeos habilitados cuando quieras que se deshabilite. Consulte Compatibilidad heredada con movimiento panorámico con barras de desplazamiento para obtener información sobre cómo deshabilitar los parpadeos de lápiz.

 

Incidencia No puedo distinguir entre la entrada del mouse y la entrada táctil de Windows.
Causa Windows genera mensajes de mouse para la compatibilidad heredada cuando un usuario hace clic en la pantalla.
Solución Puede llamar a GetMessageExtraInfo para los mensajes de 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
Incidencia Cómo ejecutar 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
Incidencia Mi aplicación está inmovilizarse por ningún 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 puede deberse a la creación de instancias de los objetos del Modelo de objetos componentes táctiles (COM) de Windows sin llamar a CoInitialize. Esto sucede a veces cuando se convierten proyectos de mediante gestos para usar las manipulaciones o interfaces de inercia.

 

Category Descripción
Incidencia Mi objeto está girando incorrectamente cuando se está traduciendo. La rotación de un solo dedo no funciona correctamente.
Causa Establecer incorrectamente los pivotes en un objeto.
Solución No está configurando correctamente los puntos de pivote de manipulación. Establezca las propiedades PivotPointX y PivotPointY en el centro del objeto o punto que desea girar y establezca la propiedad PivotRadius en el radio del objeto.

 

Solución de problemas de entrada táctil de Windows

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

 

Incidencia Estoy incluyendo windows.h, pero todavía dice 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 configuradas correctamente para Windows Touch en Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Incidencia Mis coordenadas X de entrada táctil y coordenadas Y parecen no válidas. Son valores mayores de lo esperado o son valores negativos.
Causa Es posible que tenga que convertir los puntos táctiles en 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, visite la sección High PPP de MSDN.

 

 

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

 

Category Descripción
Incidencia Estoy notando retrasos pequeños desde el momento en que toco mi dedo hacia abajo cuando 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 que el software comprueba si la entrada procede de un dedo, un lápiz o la palma del usuario. Deshabilite el rechazo de la palma llamando a RegisterTouchWindow con la marca TWF_WANTPALM desactivada.

 

Solución de problemas de gestos táctiles de Windows

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

 

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

 

Incidencia 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 como se describe en la referencia de WM_GESTURENOTIFY , o bien debe agregar un controlador para el mensaje de WM_GESTURENOTIFY . En el código siguiente se muestra cómo se puede implementar un controlador para habilitar la compatibilidad con la rotación.

C++
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; 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) { // Se ha producido un error, 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
Incidencia Las barras de desplazamiento personalizadas de mi aplicación no se desplazan al realizar el gesto de movimiento panorámico.
Causa Faltan controladores para los mensajes de WM_*SCROLL correctos.
Solución No está controlando 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
Incidencia Recibo retrasos en los gestos.
Causa Los parpadeos pueden estar causando retrasos en los gestos.
Solución Los parpadeos pueden provocar retrasos durante cuánto tiempo tarda la aplicación en recibir mensajes WM_GESTURE . Consulte Compatibilidad heredada con movimiento panorámico con barras de desplazamiento para obtener información sobre cómo deshabilitar los parpadeos.

 

Guía de programación