Résolution des problèmes liés aux applications

Cette section fournit des solutions aux problèmes courants.

Résolution de problèmes générale

Category Description
Problème J’exécute Windows Server 2008 et les fonctionnalités Windows Touch ne fonctionnent pas.
Cause Vous n’avez pas activé l’expérience utilisateur.
Solution Ouvrez l’outil d’administration Gestionnaire de serveur : cliquez sur Démarrer, pointez sur Outils d’administration, puis cliquez sur Gestionnaire de serveur. Cliquez sur l’élément Fonctionnalités dans la colonne de gauche. Cliquez sur Ajouter des fonctionnalités dans la section Fonctionnalités . Sélectionnez Expérience utilisateur, cliquez sur Suivant, puis sur Installer.

 

Category Description
Problème Chaque fois que je déplace rapidement mon doigt sur mon application, une flèche s’affiche et mon mouvement ou ma manipulation ne s’enregistre pas correctement.
Cause Activation des touches lorsque vous n’en avez pas besoin.
Solution Vous avez activé les raccourcis lorsque vous souhaitez qu’il soit désactivé. Pour plus d’informations sur la désactivation des sauts de stylet, consultez Prise en charge héritée du mouvement panoramique avec barres de défilement.

 

Problème Je ne peux pas faire de distinction entre l’entrée de la souris et l’entrée Windows Touch.
Cause Windows génère des messages de souris pour la prise en charge héritée lorsqu’un utilisateur clique sur l’écran.
Solution Vous pouvez appeler GetMessageExtraInfo pour le WM_LBUTTONDOWN et WM_LBUTTONUP messages afin de déterminer la source. Le code suivant montre comment procéder.

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 Description
Problème Comment faire exécuter des applications Microsoft PixelSense sur Windows 7 ?
Cause Windows Touch et Microsoft PixelSense sont incompatibles.
Solution Vous devez cibler la plateforme Windows 7 ou la plateforme Microsoft PixelSense.

 

Résolution des problèmes de manipulations et d’inertie

Category Description
Problème Ma demande est figé sans raison. J’obtiens des violations d’accès lorsque j’initialise mes interfaces d’objet.
Cause Il manque un appel à CoInitialize lors de l’utilisation des interfaces IManipulationProcessor ou IInertiaProcessor .
Solution Cela peut être dû à l’instanciation des objets COM (Windows Touch Component Object Model) sans appeler CoInitialize. Cela se produit parfois lorsque vous convertissez des projets en passant de l’utilisation de mouvements à l’utilisation des manipulations ou des interfaces d’inertie.

 

Category Description
Problème Mon objet est en rotation incorrecte lors de sa traduction. La rotation d’un doigt ne fonctionne pas correctement.
Cause Définition incorrecte de pivots sur un objet.
Solution Vous ne configurez pas correctement les points de tableau croisé dynamique de manipulation. Définissez les propriétés PivotPointX et PivotPointY au centre de l’objet ou du point autour duquel vous souhaitez faire pivoter, puis définissez la propriété PivotRadius sur le rayon de votre objet.

 

Résolution des problèmes d’entrée tactile Windows

Category Description
Problème Une fois que j’ai géré le message WM_TOUCH , je cesse d’obtenir des commentaires sur les limites.
Cause Consommer le message WM_TOUCH sans le gérer.
Solution Vous consommez probablement un message Windows Touch sans le transférer à DefWindowProc, ce qui entraîne un comportement inattendu. Consultez Prise en main avec les messages tactiles Windows pour plus d’informations sur la façon de gérer correctement les messages WM_TOUCH.

 

Problème J’inclut windows.h, mais il dit toujours que WM_TOUCH n’est pas défini.
Cause La version de Windows dans Targetver.h est incorrecte.
Solution Vous n’avez pas défini la version correcte de Windows dans votre projet. Le code suivant illustre la définition correcte des versions de Windows pour Windows Touch dans Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problème Mes coordonnées x et y d’entrée tactile ne semblent pas valides. Il s’agit de valeurs supérieures à ce que je m’attends ou de valeurs négatives.
Cause Vous devrez peut-être convertir vos points tactiles en pixels, ou vous devrez peut-être convertir les coordonnées de l’écran.
Solution Vérifiez que vous appelez TOUCH_COORD_TO_PIXEL et ScreenToClient. Le code suivant montre comment procéder.
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;
          }
        }
      }

Remarque :
Pour utiliser la fonction ScreenToClient , vous devez disposer d’une prise en charge élevée de ppp dans votre application. Pour plus d’informations sur la prise en charge des ppp élevés, consultez la section Résolution élevée de MSDN.

 

 

Category Description
Problème Je ne vois pas WM_TOUCH messages, mais je sais que Windows Touch fonctionne parce que je vois WM_GESTURE messages.
Cause Un appel à RegisterTouchWindow est manquant.
Solution WM_TOUCH et WM_GESTURE messages s’excluent mutuellement. Si vous n’appelez pas RegisterTouchWindow, vous recevrez uniquement WM_GESTURE messages.

 

Category Description
Problème Je note de petits retards entre le moment où je touche mon doigt jusqu’au moment où j’obtiens une entrée dans mon application.
Cause Le rejet de la paume provoque des retards dans l’entrée.
Solution Si TWF_WANTPALM est défini dans les appels à RegisterTouchWindow, le rejet de la paume est activé. Cela entraîne un petit délai (100 ms) pendant que le logiciel teste si l’entrée provient d’un doigt, d’un stylet ou de la paume de l’utilisateur. Désactivez le rejet de la paume en appelant RegisterTouchWindow avec l’indicateur TWF_WANTPALM effacé.

 

Résolution des problèmes liés aux mouvements tactiles Windows

Category Description
Problème Après avoir géré le message WM_GESTURE , j’arrête d’obtenir des commentaires sur les limites. Ou bien, un mouvement qui fonctionnait précédemment ne fonctionne pas maintenant.
Cause Consommer le message WM_GESTURE sans le gérer.
Solution Vous consommez probablement un message Windows Touch sans le transférer à DefWindowProc, ce qui entraîne un comportement inattendu. Consultez Prise en main avec les mouvements Windows pour plus d’informations sur la gestion correcte des messages WM_GESTURE.

 

Category Description
Problème Je ne vois pas WM_GESTURE messages, mais je sais que Windows Touch fonctionne parce que je vois WM_TOUCH messages.
Cause Appel de RegisterTouchWindow.
Solution WM_TOUCH et WM_GESTURE messages s’excluent mutuellement. Si vous appelez RegisterTouchWindow, vous ne recevrez pas de messages WM_GESTURE .

 

Problème Je ne vois pas tous les gestes que je m’attends à voir. Par exemple, je vois des mouvements avec l’identificateur GID_PAN mais pas GID_ROTATE.
Cause Certains mouvements, tels que le mouvement de rotation, ne sont pas activés par défaut.
Solution Vous devez appeler SetGestureConfig lorsque vous recevez un message WM_GESTURENOTIFY comme décrit dans la référence WM_GESTURENOTIFY , ou vous devez ajouter un gestionnaire pour le message WM_GESTURENOTIFY . Le code suivant montre comment implémenter un gestionnaire pour activer la prise en charge de la rotation.

C++
Carte des messages. 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; // Identificateur de mouvement. gc.dwWant = GC_ROTATE; Commande de mouvement que vous activez pour GID_ROTATE. gc.dwBlock = 0; Ne bloquez rien. UINT uiGcs = 1 ; Nombre de mouvements définis.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Un problème s’est produit, signalez l’erreur à l’aide de votre journalisation préférée. }

return 0; }

Pour obtenir d’autres exemples de configurations de mouvement classiques, consultez SetGestureConfig.

 

Category Description
Problème Les barres de défilement personnalisées de mon application ne défilent pas lorsque j’effectue le mouvement panoramique.
Cause Gestionnaires manquants pour les messages WM_*SCROLL corrects.
Solution Vous ne gérez pas tous les messages WM_*SCROLL dans vos barres de défilement personnalisées. Il est recommandé de gérer le message WM_GESTURE plutôt que de conserver les fonctionnalités de barre de défilement personnalisées via la prise en charge héritée. Vous devez prendre en charge les messages comme indiqué dans la section Prise en charge héritée du mouvement panoramique avec barres de défilement.

 

Category Description
Problème Je reçois des retards pour les gestes.
Cause Les mouvements peuvent être à l’origine de retards pour les mouvements.
Solution Les flicks peuvent entraîner des retards pendant le temps nécessaire à la réception de messages WM_GESTURE par votre application. Pour plus d’informations sur la désactivation des mouvements panoramiques, consultez Prise en charge héritée du mouvement panoramique avec barres de défilement.

 

Guide de programmation