Partager via


Interactions avec le stylet et réaction tactile

Windows a longtemps pris en charge les stylos numériques qui permettent aux utilisateurs d’interagir avec leurs appareils de manière naturelle, directe et d’exprimer leur créativité grâce à des expériences d’écriture et de dessin enrichies à l’aide d’encre numérique.

Avec Windows 11, une nouvelle fonctionnalité est introduite qui rend l’expérience de stylet numérique encore plus naturelle et attrayante : lorsque vous utilisez un stylet qui prend en charge les « commentaires haptiques », les utilisateurs peuvent réellement sentir leur stylet interagir de manière tactile avec l’interface utilisateur d’une application.

Remarque

Lorsque vous faites référence à cette nouvelle fonctionnalité, « haptic » est utilisé dans les API de développement et la documentation associée, tandis que « tactile » est le nom convivial présenté aux utilisateurs pour définir les préférences de commentaires dans les paramètres Windows.

Les expériences de commentaires haptiques prises en charge dans Windows 11 incluent les commentaires d’entrée manuscrite et les commentaires d’interaction :

  • La rétroaction manuscrite simule l’impression de différents types d’outils d’écriture ou de dessin (tels que le stylet, le marqueur, le crayon, le surligneur, etc.) par des vibrations continues pendant que le stylet est en contact avec l’écran. Par défaut, la plateforme Windows Ink prend en charge les commentaires haptiques pour tous les outils de dessin (cette rubrique explique comment fournir une solution d’entrée manuscrite personnalisée au-delà de celle prise en charge par Windows Ink).
  • Les commentaires d’interaction, d’autre part, sont des commentaires directs basés sur les actions clés de l’utilisateur, telles que le pointage ou le clic sur un bouton, la réponse à l’achèvement d’une action ou l’attirer à l’attention de l’utilisateur.

En règle générale, cinq étapes sont nécessaires pour prendre entièrement en charge les commentaires haptiques :

  • Détecter l’entrée du stylet.
  • Déterminez si le stylet actuel et l’appareil prennent en charge les commentaires haptiques et, le cas échéant, quelles fonctionnalités de commentaires haptiques il prend en charge.
  • Choisissez le signal de retour haptique à envoyer.
  • Envoyez les commentaires haptiques.
  • Arrêter les commentaires haptiques

Détecter les entrées de stylet

Pour détecter et isoler l’entrée du stylet, vous devez d’abord vous inscrire à l’événement PointerEntered, puis vérifier si PointerDeviceType est un stylet.

Le code suivant montre comment vérifier le type d’appareil de pointeur dans un événement PointerEntered. Pour cet exemple, si l’entrée ne provient pas d’un stylet, nous revenons simplement du gestionnaire d’événements. Sinon, nous vérifions les fonctionnalités du stylet et configurons les commentaires haptiques.


private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    ...
    
    // If the current Pointer device is not a pen, exit.
    if (e.Pointer.PointerDeviceType != PointerDeviceType.Pen) 
    {
       return;
    }
    
    ...    
}

Déterminer la prise en charge des commentaires haptiques

Tous les stylos et les numériseurs ne prennent pas en charge les commentaires haptiques, et les stylos qui ne prennent pas nécessairement en charge toutes les fonctionnalités de commentaires haptiques décrites dans cette rubrique. Par conséquent, il est important de confirmer par programmation quelles fonctionnalités sont prises en charge par le stylet actif.

Dans une continuation de l’exemple précédent, nous montrons comment vérifier si le stylet actif prend en charge les commentaires haptiques.

Nous essayons d’abord de récupérer un objet PenDevice à partir du PointerId actuel. Si un PenDevice ne peut pas être obtenu, nous revenons simplement du gestionnaire d’événements.

Si un PenDevice a été obtenu, nous testons s’il prend en charge une propriété SimpleHapticsController . Si ce n’est pas le cas, nous revenons simplement du gestionnaire d’événements.

// Attempt to retrieve the PenDevice from the current PointerId.
penDevice = PenDevice.GetFromPointerId(e.Pointer.PointerId);

// If a PenDevice cannot be retrieved based on the PointerId, it does not support 
// advanced pen features, such as haptic feedback. 
if (penDevice == null)
{
    return;
}

// Check to see if the current PenDevice supports haptic feedback by seeing if it 
// has a SimpleHapticsController.
hapticsController = penDevice.SimpleHapticsController;
if (hapticsController == null)
{
    return;
}

Le SimpleHapticsController récupéré dans l’exemple précédent est utilisé dans les exemples suivants pour interroger les fonctionnalités haptiques et envoyer/arrêter des commentaires haptiques.

Remarque

Si vous créez des applications avec windows App SDK Preview 1.0, vous pouvez utiliser PenDevice Interop (PenDeviceInterop.FromPointerPoint(PointerPoint)) pour accéder au système PenDevice.

private void InputObserver_PointerEntered(PointerInputObserver sender, PointerEventArgs args)
{
    var penDevice = PenDeviceInterop.PenDeviceFromPointerPoint(args.CurrentPoint);
}

Les sections suivantes décrivent les fonctionnalités de commentaires que les stylos haptiques doivent prendre en charge, ainsi que celles facultatives. Un type de commentaires haptique requis peut généralement être utilisé comme secours au lieu d’une fonctionnalité facultative.

Formes d’ondes manuscrites

Les formes d’ondes manuscrites jouent en permanence pendant que le stylet est en contact avec l’écran et tentent de simuler la sensation de divers outils d’écriture ou de dessin.

Fonctionnalité Description Obligatoire/facultatif
Forme d’ondes InkContinous Simule la sensation d’entrée manuscrite à l’aide d’un stylo à bille physique. Il s’agit de la secours par défaut lorsqu’une forme d’onde manuscrite n’est pas prise en charge par un stylet haptique. Requis
Forme d’ondes brushContinuous Signal haptique continu lorsque l’utilisateur sélectionne le pinceau comme outil d’entrée manuscrite. Facultatif
ChiselMarkerContinuous waveform Signal haptique continu lorsque l’utilisateur sélectionne le marqueur/le surligneur comme outil d’entrée manuscrite. Facultatif
GommeContinuous forme d’onde Signal haptique continu lorsque l’utilisateur sélectionne la gomme comme outil d’entrée manuscrite. Facultatif
GalaxyContinuous waveform
(la documentation HID et le guide d’implémentation font référence à cette forme d’onde en tant que SparkleContinuous)
Signal haptique continu pour les outils d’encre spéciaux, tels qu’un pinceau multicolore. Facultatif
Forme d’ondes MarkerContinuous Signal haptique continu lorsque l’utilisateur sélectionne le marqueur comme outil d’entrée manuscrite. Facultatif
Forme d’onde de crayoncontinueuse Signal haptique continu lorsque l’utilisateur sélectionne le crayon comme outil d’entrée manuscrite. Facultatif

Formes d’ondes d’interaction

Les formes d’ondes d’interaction sont généralement courtes (exceptions indiquées dans le tableau suivant), les formes d’onde de rétroaction directe générées à la demande pour confirmer les actions clés telles que le pointage ou le clic sur un bouton, la réponse à l’achèvement d’une action ou l’attirer à l’attention de l’utilisateur.

Fonctionnalité Description Obligatoire/facultatif
Cliquer sur la forme d’onde Un bref commentaire « clic ». Il s’agit de la secours par défaut lorsqu’une forme d’onde d’interaction sélectionnée par l’application n’est pas prise en charge par un stylet haptique. Requis
Formulaire d’onde d’erreur Signal fort pour avertir l’utilisateur qu’une action a échoué ou qu’une erreur s’est produite. Facultatif
Forme d’onde de pointage Indique que l’utilisateur a commencé à pointer sur un élément d’interface utilisateur interactif. Facultatif
Appuyez sur la forme d’onde Indique quand un utilisateur appuie sur un élément d’interface utilisateur interactif dans une action incrémentielle (voir Release). Facultatif
Forme d’onde de mise en production Indique quand un utilisateur libère un élément d’interface utilisateur interactif dans une action incrémentielle (voir Appuyez). Facultatif
Forme d’onde de réussite Signal fort pour avertir l’utilisateur qu’une action a réussi. Facultatif
Forme d’onde BuzzContinuous Sensation de buzzing continu. Facultatif
Forme d’onde RumbleContinuous Sensation de rumbling continu. Facultatif

Personnalisations de commentaires haptiques

Certains stylos haptiques peuvent prendre en charge les personnalisations suivantes.

Fonctionnalité Description Obligatoire/facultatif
Intensité Définit l’intensité du signal haptique. Facultatif
Nombre de lecture Répète un signal haptique un nombre spécifié de fois. Facultatif
Intervalle de pause de relecture Définit le temps entre chaque lecture répétée du signal haptique. Facultatif
Durée de lecture Définit l’intervalle de temps pendant lequel un signal haptique est lu. Facultatif

Rechercher la prise en charge des paramètres personnalisés

Pour rechercher la prise en charge de l’intensité, du nombre de lecture, de l’intervalle de pause de relecture et de la durée de lecture, utilisez les propriétés suivantes de SimpleHapticsController :

Envoyer et arrêter l’entrée manuscrite des commentaires haptiques

Utilisez la méthode SendHapticFeedback de l’objet SimpleHapticsController pour passer des formes d’ondes manuscrites au stylet de l’utilisateur. Cette méthode prend en charge le passage d’une forme d’onde ou d’une forme d’onde avec une valeur d’intensité personnalisée (voir Personnaliser les commentaires haptiques).

Appelez SendHapticFeedback et transmettez une forme d’onde manuscrite pour configurer le stylet pour commencer à lire cette forme d’onde dès que la pointe du stylet touche n’importe où sur l’écran. La forme d’onde continue de jouer jusqu’à ce que le stylet soit levé ou StopFeedback soit appelé, selon ce qui se produit en premier. Nous vous recommandons de le faire dans le gestionnaire d’événements PointerEntered pour l’élément dans lequel vous souhaitez que les haptics soient lus. Par exemple, une application avec une implémentation d’entrée manuscrite personnalisée le ferait dans la méthode PointerEntered de son canevas d’entrée manuscrite.

Pour récupérer la forme d’onde manuscrite souhaitée, vous devez effectuer une itération dans la collection SupportedFeedback de SimpleHapticsController, en vous assurant qu’elle est prise en charge par le stylet actif.

S’il n’est pas pris en charge, vous pouvez choisir de ne rien lire du tout ou de revenir à la forme d’onde InkContinuous , car cela est garanti pour être pris en charge.

Dans l’exemple suivant, nous essayons d’envoyer la forme d’onde BrushContinuous (mais revenons à InkContinuous si BrushContinuous n’est pas pris en charge).

SimpleHapticsControllerFeedback currentWaveform;

// Attempt to set the currentWaveform to BrushContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
    {
        currentWaveform = waveform;
    }
} 

// If currentWaveform is null, it was not in the SupportedFeedback collection, so instead set 
// the waveform to InkContinuous.
if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
        {
            currentWaveform = waveform;
        }
    }
}

// Send the currentWaveform 
hapticsController.SendHapticFeedback(currentWaveform);

Il est important d’arrêter également les commentaires haptiques lorsque le pointeur associé quitte l’élément que vous avez inscrit pour les commentaires haptiques. Sinon, la forme d’onde continuera à tenter de jouer sur le stylet actif.

Remarque

Certains stylos peuvent éventuellement arrêter les haptiques par eux-mêmes lorsque le stylet quitte la plage de l’écran. Toutefois, il n’est pas nécessaire que tous les stylos effectuent cette opération, de sorte que les applications doivent toujours arrêter explicitement les commentaires haptiques comme décrit ici.

Pour arrêter les commentaires haptiques sur un élément, inscrivez-vous à l’événement PointerExited sur le même élément que vous avez inscrit le gestionnaire PointerEntered qui a envoyé le signal haptique. Dans ce gestionnaire d’événements arrêté, appelez StopFeedback comme indiqué ici.

hapticsController.StopFeedback();

Envoyer et arrêter les commentaires d’interaction

L’envoi de commentaires d’interaction est assez similaire à l’envoi de commentaires d’entrée manuscrite.

Utilisez la méthode SendHapticFeedback de l’objet SimpleHapticsController pour passer les formes d’ondes d’interaction au stylet de l’utilisateur. Cette méthode prend en charge le passage d’une forme d’onde ou d’une forme d’onde avec une valeur d’intensité personnalisée (voir Personnaliser les commentaires haptiques).

Appelez SendHapticFeedback et transmettez une forme d’onde manuscrite pour configurer le stylet pour commencer à lire immédiatement cette forme d’onde en fonction d’une interaction au sein de votre application (au lieu de l’extrémité du stylet touche l’écran pour les commentaires manuscrits).

Lorsque vous utilisez l’une des formes d’ondes d’interaction non continues, il n’est pas nécessaire d’effectuer un appel StopFeedback correspondant. Vous devez toujours appeler StopFeedback pour les formes d’ondes d’interaction continue.

Remarque

L’envoi d’une forme d’onde d’interaction lorsqu’une forme d’onde d’entrée manuscrite est en cours de lecture interrompt temporairement la forme d’onde manuscrite. La forme d’onde manuscrite reprend lorsque la forme d’onde d’interaction s’arrête.

Pour récupérer la forme d’onde d’interaction souhaitée, vous devez itérer au sein de la collection SupportedFeedback de SimpleHapticsController, en vous assurant qu’elle est prise en charge par le stylet actif.

S’il n’est pas pris en charge, vous pouvez choisir de ne rien lire du tout ou de revenir à la forme d’onde Click , car cela est garanti pour être pris en charge.

Dans l’exemple suivant, nous essayons d’envoyer la forme d’onde d’erreur (mais revenons à Cliquer si l’erreur n’est pas prise en charge).

SimpleHapticsControllerFeedback currentWaveform;  

// Attempt to set the currentWaveform to BrushContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Error)
    {
        currentWaveform = waveform;
    }
} 

// If currentWaveform is null, it was not in the SupportedFeedback collection, so instead set 
// the waveform to Click.
if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
        {
            currentWaveform = waveform;
        }
    }
} 

// Send the currentWaveform.
hapticsController.SendHapticFeedback(currentWaveform); 

Personnaliser les commentaires haptiques

Il existe trois façons de personnaliser les commentaires haptiques. Le premier est pris en charge par les commentaires d’entrée manuscrite et d’interaction, tandis que les deuxième et troisième sont uniquement pris en charge par les commentaires d’interaction.

  1. Ajustez l’intensité de la rétroaction par rapport au paramètre d’intensité maximale du système. Pour ce faire, vous devez d’abord vérifier que SimpleHapticsController prend en charge la définition de l’intensité, puis appeler SendHapticFeedback avec la valeur souhaitéeIntensity.

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Répétez le signal haptique un nombre spécifié de fois. Pour ce faire, vous devez d’abord vérifier que SimpleHapticsController prend en charge la définition de l’intensité, puis appeler SendHapticFeedbackForPlayCount avec la valeur de nombre souhaitée. Vous pouvez également définir l’intensité et l’intervalle de pause de relecture.

    Remarque

    Si SimpleHapticsController ne prend pas en charge la définition de l’intensité ou de l’intervalle de pause de relecture, les valeurs fournies sont ignorées.

    if (hapticsController.IsPlayCountSupported && hapticsController.IsIntensitySupported && hapticsController.IsReplayPauseIntervalSupported)
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                int playCount = 3;
                System.TimeSpan pauseDuration = new System.TimeSpan(1000000);
                hapticsController.SendHapticFeedbackForPlayCount(currentWaveform, intensity, playCount, pauseDuration);
            }
        }
    }
    
  3. Définissez la durée du signal haptique. Pour ce faire, vous devez d’abord vérifier que SimpleHapticsController prend en charge la définition de la durée de lecture, puis appeler SendHapticFeedbackForDuration avec la valeur d’intervalle de temps souhaitée. Vous pouvez également définir l’intensité.

    Remarque

    Si SimpleHapticsController ne prend pas en charge la définition de l’intensité, la valeur fournie est ignorée.

    if (hapticsController.IsPlayDurationSupported && hapticsController.IsIntensitySupported)
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.RumbleContinuous)
            {
                double intensity = 0.75;
                System.TimeSpan playDuration = new System.TimeSpan(5000000);
                hapticsController.SendHapticFeedbackForDuration(currentWaveform, intensity, playDuration);
            }
        }
    }
    

Exemples

Consultez l’exemple de haptics pen pour obtenir des exemples de fonctionnement des fonctionnalités suivantes :