Partilhar via


Solução de problemas de aplicativos

Esta secção apresenta soluções para problemas comuns.

Solução de problemas gerais

Categoria Descrição
Questão Estou executando o Windows Server 2008 e os recursos do Windows Touch não estão funcionando.
Causa Não ativou a Experiência Desktop.
Solução Abra a ferramenta administrativa do Gerenciador do Servidor: clique em Iniciar, aponte para Ferramentas Administrativase clique em Gerenciador do Servidor. Clique no item Recursos na coluna à esquerda. Clique em Adicionar Funcionalidades na secção Funcionalidades. Selecione Experiência Desktop, clique em Avançare, em seguida, clique em Instalar.

 

Categoria Descrição
Questão Sempre que movo o dedo rapidamente pela minha aplicação, aparece uma seta e o meu gesto ou manipulação não está a registar-se corretamente.
Causa Ter os movimentos ativados quando não precisar deles.
Solução Você tem os gestos ativados quando deseja que estejam desativados. Consulte Suporte herdado para paneamento com barras de deslocamento para obter informações sobre como desativar gestos de caneta.

 

Questão Não consigo discernir entre a entrada do rato e a entrada do Windows Touch.
Causa Windows gera mensagens de rato para suporte herdado quando um usuário clica na tela.
Solução Você pode chamar GetMessageExtraInfo para obter as mensagens WM_LBUTTONDOWN e WM_LBUTTONUP 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
Questão Como posso executar aplicações Microsoft PixelSense no Windows 7?
Causa O Windows Touch e o Microsoft PixelSense são incompatíveis.
Solução Você precisa focar na plataforma Windows 7 ou na plataforma Microsoft PixelSense.

 

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

Categoria Descrição
Questão A minha candidatura está a congelar 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 estás a converter projetos de utilização de gestos para a utilização das manipulações ou interfaces de inércia.

 

Categoria Descrição
Questão Meu objeto está girando incorretamente quando está sendo traduzido. A rotação de um dedo não está funcionando corretamente.
Causa A configuração incorreta de pivôs em um objeto.
Solução Você não está configurando os pontos de pivô de manipulação corretamente. Defina as propriedades PivotPointX e PivotPointY para o centro do objeto ou ponto em que deseja girar, e defina a propriedade PivotRadius para o raio do seu objeto.

 

Solução de problemas do Windows Touch Input

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

 

Questão Estou incluindo windows.h, mas ainda diz que WM_TOUCH não está definido.
Causa A versão do Windows no 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 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

 

Questão As coordenadas de entrada por toque x e y parecem inválidas. Ou são valores maiores do que eu espero ou são valores negativos.
Causa Talvez seja necessário converter seus pontos de toque em pixels ou converter as coordenadas da tela.
Solução Certifique-se de que 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;
          }
        }
      }

Nota:
Para usar a função ScreenToClient, você deve ter suporte a DPI alto em seu aplicativo. Para obter mais informações sobre como oferecer suporte a DPI alto, consulte DPI alto.

 

 

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

 

Categoria Descrição
Questão Estou a notar pequenos atrasos desde o momento em que toco o dedo até ao momento em que estou a receber entrada na minha aplicação.
Causa A rejeição da palma está causando atrasos na entrada.
Solução Se TWF_WANTPALM estiver definido em chamadas para RegisterTouchWindow, a rejeição da palma da mão estará ativada. Isso causa um pequeno atraso (100 ms) enquanto o software testa se a entrada está vindo de um dedo, caneta ou palma da mão do usuário. Desative a rejeição da palma chamando RegisterTouchWindow com o sinalizador de TWF_WANTPALM limpo.

 

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

Categoria Descrição
Questão Depois de lidar com a mensagem WM_GESTURE, paro de receber feedback de limite. Ou, um gesto que funcionava anteriormente não funciona agora.
Causa Consumir a mensagem WM_GESTURE sem manipulá-la.
Solução Você provavelmente está consumindo uma mensagem do Windows Touch sem encaminhá-la para DefWindowProc, o que resultará em um comportamento inesperado. Consulte Introdução aos Gestos do Windows para obter mais informações sobre como lidar corretamente com WM_GESTURE mensagens.

 

Categoria Descrição
Questão Não estou a ver WM_GESTURE mensagens, mas sei que o Windows Touch está a funcionar porque estou a ver WM_TOUCH mensagens.
Causa Chamando RegisterTouchWindow.
Solução WM_TOUCH e WM_GESTURE as mensagens são mutuamente exclusivas. Se você ligar para RegisterTouchWindow, você não receberá WM_GESTURE mensagens.

 

Questão Não estou a ver 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 estã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 à 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 gestos. gc.dwWant = GC_ROTATE; O comando de gesto que você está ativando para GID_ROTATE. gc.dwBlock = 0; Não bloqueie nada. UINT uiGcs = 1; O número de gestos a serem definidos.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Algo correu mal, reporte o erro utilizando o seu método de registo preferido. }

return 0; }

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

 

Categoria Descrição
Questão As barras de rolagem personalizadas no meu aplicativo não estão rolando quando executo o gesto de arrastamento.
Causa Estão em falta manipuladores para as mensagens corretas WM_*SCROLL.
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 de barra de rolagem personalizada por meio do suporte herdado. Você precisa oferecer suporte a mensagens conforme detalhado na seção Suporte herdado para movimento panorâmico com barras de rolagem.

 

Categoria Descrição
Questão Estou a ter atrasos ao executar gestos.
Causa Flicks podem estar causando atrasos nos gestos.
Solução Os movimentos podem causar atrasos no tempo que o aplicativo leva para receber WM_GESTURE mensagens. Consulte Suporte herdado para movimento com barras de deslocamento para obter informações sobre como desativar flicks.

 

Guia de Programação