Solução de problemas de aplicativos

Esta seção fornece soluções para problemas comuns.

Solução de problemas gerais

Categoria Descrição
Problema Estou executando o Windows Server 2008 e os recursos do Windows Touch não estão funcionando.
Causa Você não habilitou a Experiência desktop.
Solução Abra a ferramenta administrativa Gerenciador do Servidor: clique em Iniciar, aponte para Ferramentas Administrativas e clique em Gerenciador do Servidor. Clique no item Recursos na coluna à esquerda. Clique em Adicionar Recursos na seção Recursos . Selecione Experiência da Área de Trabalho, clique em Avançar e, em seguida, clique em Instalar.

 

Categoria Descrição
Problema Sempre que eu mover meu dedo rapidamente pelo meu aplicativo, uma seta aparece e meu gesto ou manipulação não está se registrando corretamente.
Causa Ter movimentos habilitados quando você não precisar dele.
Solução Você tem movimentos habilitados quando deseja que ele seja desabilitado. Consulte Suporte herdado para movimento panorâmico com barras de rolagem para obter informações sobre como desabilitar movimentos de caneta.

 

Problema Não consigo discernir entre a entrada do mouse e a entrada do Windows Touch.
Causa O Windows gera mensagens de mouse para suporte herdado quando um usuário clica na tela.
Solução Você pode chamar GetMessageExtraInfo para o WM_LBUTTONDOWN e WM_LBUTTONUP mensagens para determinar a origem. O código a seguir mostra como isso pode ser feito.

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

 

Categoria Descrição
Problema Como fazer executar aplicativos Do Microsoft PixelSense no Windows 7?
Causa O Windows Touch e o Microsoft PixelSense são incompatíveis.
Solução Você precisa direcionar a plataforma Windows 7 ou a plataforma Microsoft PixelSense.

 

Solução de problemas de manipulações e inércia

Categoria Descrição
Problema Meu aplicativo está congelando sem motivo. Estou recebendo violações de acesso quando inicializo minhas interfaces de objeto.
Causa Falta uma chamada para CoInitialize ao usar as interfaces IManipulationProcessor ou IInertiaProcessor .
Solução Isso pode ser causado pela instanciação dos objetos COM (Windows Touch Component Object Model) sem chamar CoInitialize. Isso acontece às vezes quando você está convertendo projetos de usando gestos para usar as manipulações ou interfaces de inércia.

 

Categoria Descrição
Problema Meu objeto está girando incorretamente quando está sendo traduzido. A rotação de dedo único não está funcionando corretamente.
Causa Configuração incorreta de pivôs em um objeto .
Solução Você não está configurando os pontos dinâmicos de manipulação corretamente. Defina as propriedades PivotPointX e PivotPointY como o centro do objeto ou ponto que você deseja girar e defina a propriedade PivotRadius como o raio do objeto.

 

Solução de problemas de entrada do Windows Touch

Categoria Descrição
Problema Depois de lidar com a mensagem WM_TOUCH , paro de receber comentários de limite.
Causa Consumir a mensagem WM_TOUCH sem lidar com ela.
Solução Você provavelmente está consumindo uma mensagem do Windows Touch sem encaminhá-la para DefWindowProc, o que resultará em um comportamento inesperado. Verifique Introdução com Mensagens de Toque do Windows para obter mais informações sobre como lidar corretamente com mensagens WM_TOUCH.

 

Problema Estou incluindo windows.h, mas ainda diz que WM_TOUCH não está definido.
Causa A versão do Windows em Targetver.h está incorreta.
Solução Você não definiu a versão correta do Windows em seu projeto. O código a seguir ilustra as versões corretamente definidas do Windows para Windows Touch no Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problema Minhas coordenadas x de entrada de toque e coordenadas y parecem inválidas. Eles são valores maiores do que eu esperava ou são valores negativos.
Causa Talvez seja necessário converter seus pontos de toque em pixels ou talvez seja necessário converter as coordenadas da tela.
Solução Verifique se você está chamando TOUCH_COORD_TO_PIXEL e ScreenToClient. O código a seguir mostra como fazer isso.
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;
          }
        }
      }

Observação:
Para usar a função ScreenToClient , você deve ter alto suporte a DPI em seu aplicativo. Para obter mais informações sobre como dar suporte ao DPI alto, visite a seção Alto DPI do MSDN.

 

 

Categoria Descrição
Problema Não estou vendo mensagens WM_TOUCH , mas sei que o Windows Touch está funcionando porque estou vendo mensagens WM_GESTURE .
Causa Falta uma chamada para RegisterTouchWindow.
Solução WM_TOUCH e mensagens WM_GESTURE são mutuamente exclusivas. Se você não chamar RegisterTouchWindow, receberá apenas WM_GESTURE mensagens.

 

Categoria Descrição
Problema Estou percebendo pequenos atrasos desde o momento em que toco o dedo até quando estou recebendo entrada no meu aplicativo.
Causa A rejeição da palma da mão está causando atrasos na entrada.
Solução Se TWF_WANTPALM for definido em chamadas para RegisterTouchWindow, a rejeição da palma da mão será habilitada. Isso causa um pequeno atraso (100 ms), enquanto o software testa se a entrada vem de um dedo, caneta ou palma do usuário. Desabilite a rejeição da palma chamando RegisterTouchWindow com o sinalizador TWF_WANTPALM limpo.

 

Solução de problemas de gestos de toque do Windows

Categoria Descrição
Problema Depois de lidar com a mensagem de WM_GESTURE , interrompa a obtenção de comentários de limite. Ou, um gesto que funcionou anteriormente não funciona agora.
Causa Consumir a mensagem WM_GESTURE sem lidar com ela.
Solução Você provavelmente está consumindo uma mensagem do Windows Touch sem encaminhá-la para DefWindowProc, o que resultará em um comportamento inesperado. Verifique Introdução com gestos do Windows para obter mais informações sobre como lidar corretamente com mensagens WM_GESTURE.

 

Categoria Descrição
Problema Não estou vendo WM_GESTURE mensagens, mas sei que o Windows Touch está funcionando porque estou vendo mensagens WM_TOUCH .
Causa Chamando RegisterTouchWindow.
Solução WM_TOUCH e mensagens WM_GESTURE são mutuamente exclusivas. Se você chamar RegisterTouchWindow, não receberá WM_GESTURE mensagens.

 

Problema Não estou vendo todos os gestos que espero ver. Por exemplo, estou vendo gestos com o identificador GID_PAN mas não GID_ROTATE.
Causa Alguns gestos, como o gesto de girar, não são habilitados por padrão.
Solução Você precisa chamar SetGestureConfig quando receber uma mensagem WM_GESTURENOTIFY conforme descrito na referência WM_GESTURENOTIFY ou precisa adicionar um manipulador para a mensagem WM_GESTURENOTIFY . O código a seguir mostra como um manipulador pode ser implementado para habilitar o suporte para rotação.

C++
O mapa de mensagens. 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; // O identificador de gesto. gc.dwWant = GC_ROTATE; O comando de gesto que você está habilitando para GID_ROTATE. gc.dwBlock = 0; Não bloqueie nada. UINT uiGcs = 1; O número de gestos que estão sendo definidos.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); se(!bResult) { // Algo deu errado, relate o erro usando o log preferencial. }

return 0; }

Para obter mais exemplos de configurações de gesto típicas, consulte SetGestureConfig.

 

Categoria Descrição
Problema As barras de rolagem personalizadas no meu aplicativo não estão rolando quando faço o gesto de panorâmica.
Causa Manipuladores ausentes para as mensagens WM_*SCROLL corretas.
Solução Você não está lidando com todas as mensagens WM_*SCROLL em suas barras de rolagem personalizadas. É recomendável que você manipule a mensagem WM_GESTURE em vez de manter a funcionalidade da barra de rolagem personalizada por meio do suporte herdado. Você precisa dar suporte a mensagens conforme detalhado na seção Suporte herdado para movimento panorâmico com barras de rolagem.

 

Categoria Descrição
Problema Estou recebendo atrasos por gestos.
Causa Os movimentos podem estar causando atrasos para gestos.
Solução Os movimentos podem causar atrasos por quanto tempo seu aplicativo leva para receber mensagens WM_GESTURE . Consulte Suporte herdado para movimento panorâmico com barras de rolagem para obter informações sobre como desabilitar movimentos.

 

Guia de programação