Partager via


Prise en main avec les messages tactiles Windows

Cette section décrit les tâches associées à l’obtention d’une entrée Windows Touch pour fonctionner dans votre application.

Les étapes suivantes sont généralement effectuées lors de l’utilisation de messages Windows Touch :

  1. Testez les fonctionnalités du numériseur d’entrée.
  2. Inscrivez-vous pour recevoir des messages Windows Touch.
  3. Gérez les messages.

Le message utilisé pour Windows Touch est WM_TOUCH. Ce message indique les différents états de contact avec un numériseur.

Test des fonctionnalités du numériseur d’entrée

La fonction GetSystemMetrics peut être utilisée pour interroger les fonctionnalités du numériseur d’entrée en transmettant la valeur nIndex de SM_DIGITIZER. GetSystemMetrics retourne un champ bit qui indique si l’appareil est prêt, si l’appareil prend en charge le stylet ou le toucher, si le périphérique d’entrée est intégré ou externe et si l’appareil prend en charge plusieurs entrées (Windows Touch). Le tableau suivant montre les bits des différents champs.

bit 8 7 6 5 4 3 2 1
Valeur Stack Ready Multi-entrée Réservé Réservé Stylet externe Stylet intégré Contact externe Interaction tactile intégrée

 

Pour tester le résultat de la commande pour une fonctionnalité particulière, vous pouvez utiliser l’opérateur au niveau & du bit et le bit particulier que vous testez. Par exemple, pour tester Windows Touch, vous devez tester que le bit de septième ordre est défini (0x40 en hexadécimal). L’exemple de code suivant montre comment ces valeurs peuvent être testées.

#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value  & NID_MULTI_INPUT){
    /* digitizer is multitouch */ 
    MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}

Le tableau suivant répertorie les constantes définies dans windows.h pour tester les fonctionnalités tactiles du numériseur d’entrée.

Nom Valeur Description
TABLET_CONFIG_NONE 0x00000000 Le numériseur d’entrée n’a pas de fonctionnalités tactiles.
NID_INTEGRATED_TOUCH 0x00000001 Un numériseur tactile intégré est utilisé pour l’entrée.
NID_EXTERNAL_TOUCH 0x00000002 Un numériseur tactile externe est utilisé pour l’entrée.
NID_INTEGRATED_PEN 0x00000004 Un numériseur de stylet intégré est utilisé pour l’entrée.
NID_EXTERNAL_PEN 0x00000008 Un numériseur de stylet externe est utilisé pour l’entrée.
NID_MULTI_INPUT 0x00000040 Un numériseur d’entrée avec prise en charge de plusieurs entrées est utilisé pour l’entrée.
NID_READY 0x00000080 Le numériseur d’entrée est prêt pour l’entrée. Si cette valeur n’est pas définie, cela peut signifier que le service de tablette est arrêté, que le numériseur n’est pas pris en charge ou que les pilotes du numériseur n’ont pas été installés.

 

La vérification des valeurs NID_* est un moyen utile de vérifier les fonctionnalités de l’ordinateur d’un utilisateur pour configurer votre application pour une entrée tactile, stylet ou non-tablette. Par exemple, si vous disposez d’une interface utilisateur dynamique et que vous souhaitez configurer automatiquement une partie de celle-ci, vous pouvez case activée pour NID_INTEGRATED_TOUCH, NID_MULTITOUCH et obtenir le nombre maximal de touches la première fois qu’un utilisateur exécute votre application.

Notes

Il existe certaines limitations inhérentes à SM_GETSYSTEMMETRICS. Par exemple, il n’y a pas de prise en charge du plug-and-play. Pour cette raison, soyez prudent lorsque vous utilisez cette fonction comme moyen de configuration permanente.

 

Inscription à la réception d’une entrée Windows Touch

Avant de recevoir une entrée Windows Touch, les applications doivent d’abord s’inscrire pour recevoir l’entrée Windows Touch. En inscrivant la fenêtre d’application, l’application indique qu’elle est compatible tactile. Une fois que l’application a inscrit sa fenêtre, les notifications du pilote Windows Touch sont transférées à l’application lorsque l’entrée est effectuée dans la fenêtre. Lorsque l’application s’arrête, elle annule l’inscription de sa fenêtre pour désactiver les notifications.

Notes

WM_TOUCH messages sont actuellement « gourmands ». Une fois le premier message tactile reçu dans une fenêtre, tous les messages tactiles sont envoyés à cette fenêtre jusqu’à ce qu’une autre fenêtre reçoive le focus.

 

Notes

Par défaut, vous recevez des messages WM_GESTURE plutôt que des messages WM_TOUCH . Si vous appelez RegisterTouchWindow, vous ne recevrez plus WM_GESTURE messages.

 

Le code suivant montre comment une application peut s’inscrire pour recevoir des messages Windows Touch dans une application Win32.

RegisterTouchWindow(hWnd, 0);

Gestion des messages tactiles Windows

Vous pouvez gérer les messages Windows Touch à partir d’applications dans les systèmes d’exploitation Windows de plusieurs façons. Si vous programmez une application GUI, vous ajoutez du code dans la WndProc fonction pour gérer les messages d’intérêt. Si vous programmez une classe MFC (Microsoft Foundation Class) ou une application managée, vous ajoutez des gestionnaires pour les messages d’intérêt. L’exemple de code suivant montre comment les messages tactiles peuvent être gérés à partir de WndProc dans une application Windows.

  LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
    BOOL bHandled = FALSE;
    UINT cInputs = LOWORD(wParam);
    PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
    if (pInputs){
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
            for (UINT i=0; i < cInputs; i++){
                TOUCHINPUT ti = pInputs[i];
                //do something with each touch input entry
            }            
            bHandled = TRUE;
        }else{
             /* handle the error here */
        }
        delete [] pInputs;
    }else{
        /* handle the error here, probably out of memory */
    }
    if (bHandled){
        // if you handled the message, close the touch input handle and return
        CloseTouchInputHandle((HTOUCHINPUT)lParam);
        return 0;
    }else{
        // if you didn't handle the message, let DefWindowProc handle it
        return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
    }
  }


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
      // pass touch messages to the touch handler 
      case WM_TOUCH:
        OnTouch(hWnd, wParam, lParam);
        break;

Le code suivant montre comment implémenter la carte de messages et un gestionnaire de messages. Notez que les messages doivent être déclarés dans la carte des messages, puis le gestionnaire du message doit être implémenté. Par exemple, dans une application MFC, cela peut être déclaré dans le code de boîte de dialogue. Notez également que la OnInitDialog fonction de votre fenêtre de dialogue doit inclure un appel à RegisterTouchWindow tel que RegisterTouchWindow(m_hWnd, 0).

  // Class implementations within a dialog
  LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
    //Insert handler code here to do something with the message or uncomment the following line to test
    //MessageBox(L"touch!", L"touch!", MB_OK);
    return 0;
  }
  // The message map
  BEGIN_MESSAGE_MAP()
    ON_WM_CREATE()
    ... ... ...
    ON_MESSAGE(WM_TOUCH, OnTouch)
  END_MESSAGE_MAP()  
 
  BOOL TestDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();    

    RegisterTouchWindow(m_hWnd, 0);
     ... ... ...
  }  
  

Le fait de toucher la fenêtre indique les touches à partir d’une fenêtre contextuelle.

Entrée Windows Touch