Dépannage des applications

Cette section donne des solutions aux problèmes courants.

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

Category Description
Problème Je fais fonctionner 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 du 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 cliquez sur Installer.

 

Category Description
Problème Chaque fois que je déplace rapidement mon doigt sur mon application, une flèche apparaît et mon geste ou ma manipulation ne s’enregistre pas correctement.
Cause Avoir les flicks activés alors que vous n’en avez pas besoin.
Solution Vous avez les flicks activés alors que vous souhaitez les désactiver. Veuillez consulter la section Support hérité pour le panoramique avec barres de défilement pour des informations sur la désactivation des flicks de stylet.

 

Problème Je ne peux pas discerner entre l’entrée de la souris et l’entrée Windows Touch.
Cause Windows génère des messages de souris pour le support hérité lorsqu’un utilisateur clique sur l’écran.
Solution Vous pouvez appeler GetMessageExtraInfo pour les messages WM_LBUTTONDOWN et WM_LBUTTONUP pour déterminer la source. Le code suivant montre comment cela pourrait être fait.

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 puis-je exécuter des applications Microsoft PixelSense sur Windows 7 ?
Cause Windows Touch et Microsoft PixelSense sont incompatibles.
Solution Vous devez soit cibler la plateforme Windows 7 soit la plateforme Microsoft PixelSense.

 

Dépannage des manipulations et de l’inertie

Category Description
Problème Mon application se fige sans raison. Je reçois des violations d’accès lorsque j’initialise les interfaces de mes objets.
Cause Un appel à CoInitialize manquant 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 utilisant des gestes en projets utilisant les interfaces de manipulations ou d’inertie.

 

Category Description
Problème Mon objet tourne de manière incorrecte lorsqu’il est traduit. La rotation à un seul doigt ne fonctionne pas correctement.
Cause Réglage incorrect des pivots sur un objet.
Solution Vous ne configurez pas correctement les points de pivot de la manipulation. Réglez les propriétés PivotPointX et PivotPointY au centre de l’objet ou du point autour duquel vous souhaitez faire pivoter, et réglez la propriété PivotRadius au rayon de votre objet.

 

Dépannage des entrées Windows Touch

Category Description
Problème Après avoir traité le message WM_TOUCH, je cesse de recevoir des retours de limites.
Cause Consommer le message WM_TOUCH sans le traiter.
Solution Vous consommez probablement un message Windows Touch sans le transmettre à DefWindowProc, ce qui entraînera un comportement inattendu. Consultez la section Pour bien démarrer avec les messages Windows Touch pour plus d’informations sur la façon de traiter correctement les messages WM_TOUCH.

 

Problème J’inclus windows.h, mais il est toujours indiqué 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 les versions de Windows correctement définies pour Windows Touch sous Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problème Les coordonnées x et y de mon entrée tactile semblent invalides. Elles sont soit des valeurs plus grandes que prévu, soit des 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 Assurez-vous 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, votre application doit prendre en charge les DPI élevés. Pour plus d’informations sur la prise en charge des DPI élevés, consultez la section High DPI.

 

 

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

 

Category Description
Problème Je remarque de petits délais entre le moment où je pose mon doigt et le moment où je reçois une entrée dans mon application.
Cause Le rejet de la paume cause des délais dans l’entrée.
Solution Si TWF_WANTPALM est défini dans les appels à RegisterTouchWindow, le rejet de la paume est activé. Cela provoque 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 désactivé.

 

Dépannage des gestes Windows Touch

Category Description
Problème Après avoir traité le message WM_GESTURE, je cesse de recevoir des retours de limites. Ou, un geste qui fonctionnait auparavant ne fonctionne plus maintenant.
Cause Consommer le message WM_GESTURE sans le traiter.
Solution Vous consommez probablement un message Windows Touch sans le transmettre à DefWindowProc, ce qui entraînera un comportement inattendu. Consultez la section Pour bien démarrer avec les gestes Windows pour plus d’informations sur la façon de traiter correctement les messages WM_GESTURE.

 

Category Description
Problème Je ne vois pas les messages WM_GESTURE, mais je sais que Windows Touch fonctionne parce que je vois les messages WM_TOUCH.
Cause Appel à RegisterTouchWindow.
Solution Les messages WM_TOUCH et WM_GESTURE sont mutuellement exclusifs. 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 gestes avec l’identifiant GID_PAN mais pas GID_ROTATE.
Cause Certains gestes, comme le geste 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 un gestionnaire pourrait être implémenté pour activer la prise en charge de la rotation.

C++
// La 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; // L’identifiant du geste. gc.dwWant = GC_ROTATE; // La commande de geste que vous activez pour GID_ROTATE. gc.dwBlock = 0; // Ne bloquez rien. UINT uiGcs = 1; // Le nombre de gestes configurés.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Quelque chose s’est mal passé, signalez l’erreur en utilisant votre méthode de journalisation préférée. }

return 0; }

Pour plus d’exemples de configurations de gestes typiques, consultez la section SetGestureConfig.

 

Category Description
Problème Les barres de défilement personnalisées de mon application ne défilent pas lorsque j’effectue le geste de 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 la fonctionnalité des barres de défilement personnalisées via le support hérité. Vous devez prendre en charge les messages comme détaillé dans la section Support hérité pour le panoramique avec barres de défilement.

 

Category Description
Problème Je constate des délais pour les gestes.
Cause Les flicks peuvent causer des délais pour les gestes.
Solution Les flicks peuvent causer des délais pour le temps qu’il faut à votre application pour recevoir les messages WM_GESTURE. Consultez la section Support hérité pour le panoramique avec barres de défilement pour des informations sur la désactivation des flicks.

 

Guide de programmation