Compartilhar via


Aplicativos para solução de problemas

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

Solução de problemas gerais

Categoria Descrição
Problema Estou usando o Windows Server 2008 e os recursos do Windows Touch não estão funcionando.
Causa Você não ativou a Experiência Desktop.
Solução Abra a ferramenta administrativa do 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 Desktop, clique em Avançar e depois em Instalar.

 

Categoria Descrição
Problema Sempre que eu movo meu dedo rapidamente pelo meu aplicativo, uma seta aparece e meu gesto ou manipulação não é registrado corretamente.
Causa Ter os movimentos ativados quando você não precisa.
Solução Você está deixando os movimentos ativados quando precisa que eles fiquem desativados. Consulte Suporte legado para panorâmica com barras de rolagem para obter informações sobre como desabilitar movimentos de caneta.

 

Problema Não consigo distinguir entre a entrada do mouse e a entrada do Windows Touch.
Causa O Windows emite mensagens de mouse para suporte legado quando um usuário clica na tela.
Solução Você pode chamar GetMessageExtraInfo para as mensagens WM_LBUTTONDOWN e WM_LBUTTONUP para determinar a origem. O código a seguir mostra como isso poderia 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 executo 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 do Windows 7 ou a plataforma do Microsoft PixelSense.

 

Solucionar problemas de manipulações e inércia

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

 

Categoria Descrição
Problema Meu objeto gira incorretamente ao ser convertido. A rotação de um dedo não está funcionando direito.
Causa Configuração incorreta de pivôs em um objeto.
Solução Você não está configurando corretamente os pontos de pivô de manipulação. Defina as propriedades PivotPointX e PivotPointY para o centro do objeto ou ponto em volta do qual você deseja girar e defina a propriedade PivotRadius para o raio do seu objeto.

 

Solução de problemas de entrada do Windows Touch

Categoria Descrição
Problema Depois de lidar com a mensagem WM_TOUCH, eu paro de receber comentários sobre limites.
Causa Consumindo a mensagem WM_TOUCH sem manipulá-la.
Solução Você provavelmente está consumindo uma mensagem do Windows Touch sem encaminhá-la para DefWindowProc, que resultará em um comportamento inesperado. Consulte Introdução às mensagens do Windows Touch para mais informações sobre como lidar adequadamente com mensagens WM_TOUCH.

 

Problema Estou incluindo o windows.h, mas ainda diz que WM_TOUCH não está definido.
Causa A versão do Windows em Targetver.h é incorreta.
Solução Você não definiu a versão correta do Windows no seu projeto. O código seguinte ilustra as versões do Windows definidas corretamente para o 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 e y de entrada de toque parecem inválidas. Tratam-se de valores maiores do que eu esperava ou de valores negativos.
Causa Pode ser preciso converter seus pontos de toque em pixels ou 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 utilizar a função ScreenToClient, você deve ter suporte a DPI alto em seu aplicativo. Para mais informações sobre como dar suporte a DPI alto, consulte DPI alto.

 

 

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

 

Categoria Descrição
Problema Estou percebendo atrasos desde o momento em que toco meu dedo até quando recebo informações no meu aplicativo.
Causa A rejeição da palma 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 atraso (100 ms) enquanto o software testa se a entrada vem de um dedo, caneta ou da palma da mão do usuário. Desabilite a rejeição da palma da mão chamando RegisterTouchWindow com o sinalizador TWF_WANTPALM desmarcado.

 

Solução de problemas de gestos do Windows Touch

Categoria Descrição
Problema Depois de lidar com a mensagem do WM_GESTURE, eu paro de receber comentários sobre limites. Ou um gesto que funcionava antes não está funcionando agora.
Causa Consumindo a mensagem WM_GESTURE sem manipulá-la.
Solução Você provavelmente está consumindo uma mensagem do Windows Touch sem encaminhá-la para DefWindowProc, que resultará em um comportamento inesperado. Consulte Introdução aos gestos do Windows para obter mais informações sobre como lidar corretamente com mensagens do WM_GESTURE.

 

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

 

Problema Não estou vendo os gestos que espero ver. Por exemplo, estou vendo os gestos com o identificador GID_PAN mas não GID_ROTATE.
Causa Alguns gestos, como o gesto de rotação, 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 você precisa adicionar um manipulador para a mensagem WM_GESTURENOTIFY. O seguinte código mostra como um manipulador pode ser implementado para habilitar o suporte à rotação.

C++
// O mapa da mensagem. 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 bloquear nada. UINT uiGcs = 1; // O número de gestos que estão sendo definidos.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Algo deu errado. Relate o erro usando seu registro preferido. }

return 0; }

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

 

Categoria Descrição
Problema As barras de rolagem personalizadas no meu aplicativo não rolam quando eu faço o gesto de movimento panorâmico.
Causa Manipuladores ausentes para as mensagens corretas de WM_*SCROLL.
Solução Você não está lidando com todas as mensagens WM_*SCROLL nas barras de rolagem personalizadas. É recomendável manipular a mensagem WM_GESTURE em vez de manter a funcionalidade da barra de rolagem personalizada pelo suporte legado. Você precisa dar suporte a mensagens conforme detalhado na seção Suporte legado para movimento panorâmico com barras de rolagem.

 

Categoria Descrição
Problema Estou recebendo atrasos para gestos.
Causa Os movimentos podem estar fazendo os gestos atrasar.
Solução Os movimentos podem causar atrasos no tempo que seu aplicativo leva para receber mensagens de WM_GESTURE. Consulte Suporte legado para panorâmica com barras de rolagem para obter informações sobre como desabilitar movimentos.

 

Guia de programação