Share via


Interactions avec le stylet et réaction tactile

Windows prend depuis longtemps en charge les stylets numériques qui permettent aux utilisateurs d’interagir avec leurs appareils de manière naturelle et directe et d’exprimer leur créativité par le biais d’expériences riches d’écriture et de dessin à l’aide de l’entrée manuscrite numérique.

Avec Windows 11, une nouvelle fonctionnalité est introduite qui rend l’expérience du stylet numérique encore plus naturelle et attrayante : lors de l’utilisation d’un stylet qui prend en charge le « retour haptique », les utilisateurs peuvent réellement sentir leur stylet interagir de manière tactile avec l’interface utilisateur (IU) d’une application.

Notes

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 lescommentaires d’interaction :

  • La rétroaction manuscrite simule la sensation de différents types d’outils d’écriture ou de dessin (comme le stylet, le marqueur, le crayon, le surligneur, etc.) par le biais de 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, en revanche, sont des commentaires directs basés sur des actions clés de l’utilisateur, telles que pointer ou cliquer sur un bouton, répondre à l’achèvement d’une action ou 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 et l’appareil actuels prennent en charge les commentaires haptiques et, le cas échéant, quelles fonctionnalités de commentaires haptiques il prend en charge.
  • Déterminez le signal de rétroaction haptique à envoyer.
  • Envoyez les commentaires haptiques.
  • Arrêter le retour haptique

Détecter l’entrée du stylet

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

Le code suivant montre comment case activée le type d’appareil pointeur dans un événement PointerEntered. Pour cet exemple, si l’entrée ne provient pas d’un stylet, nous revenons simplement à partir du gestionnaire d’événements. Sinon, nous case activée les fonctionnalités du stylet et nous 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 numériseurs ne prennent pas en charge les commentaires haptiques, et les stylos qui le font 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 les fonctionnalités prises en charge par le stylet actif.

Dans la suite de l’exemple précédent, nous montrons comment case activée si le stylet actif prend en charge le retour haptique.

Nous essayons tout d’abord de récupérer un objet PenDevice à partir de l’id PointerId actuel. Si un PenDevice ne peut pas être obtenu, nous revenons simplement à partir 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 à partir 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 pour envoyer/arrêter des commentaires haptiques.

Notes

Si vous créez des applications avec le 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 qui sont facultatives. Un type de commentaires haptiques requis peut généralement être utilisé comme secours au lieu d’une fonctionnalité facultative.

Formes d’onde manuscrites

Les formes d’onde manuscrites jouent en continu 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’onde InkContinous Simule la sensation d’entrée manuscrite à l’aide d’un stylo à bille physique. Il s’agit du secours par défaut lorsqu’une forme d’onde manuscrite n’est pas prise en charge par un stylet haptique. Obligatoire
PinceauForme d’onde continue Signal haptique continu lorsque l’utilisateur sélectionne le pinceau comme outil d’entrée manuscrite. Facultatif
ChiselMarkerContinuous forme d’onde Signal haptique continu lorsque l’utilisateur sélectionne le marqueur/surligneur de ciseau comme outil d’entrée manuscrite. Facultatif
GommeForme d’onde continue Signal haptique continu lorsque l’utilisateur sélectionne la gomme comme outil d’entrée manuscrite. Facultatif
GalaxyContinuous waveform
(la documentation et le guide d’implémentation HID 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
MarkerContinuous waveform Signal haptique continu lorsque l’utilisateur sélectionne le marqueur comme outil d’entrée manuscrite. Facultatif
CrayonForme d’onde continue Signal haptique continu lorsque l’utilisateur sélectionne le crayon comme outil d’entrée manuscrite. Facultatif

Formes d’onde d’interaction

Les formes d’onde d’interaction sont généralement courtes (exceptions notées dans le tableau suivant), des formes d’onde de rétroaction directes générées à la demande pour confirmer des actions clés telles que pointer sur un bouton ou cliquer sur un bouton, répondre à l’achèvement d’une action ou attirer l’attention de l’utilisateur.

Fonctionnalité Description Obligatoire/facultatif
Cliquer sur la forme d’onde Un bref « clic » de commentaires. Il s’agit du 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. Obligatoire
Forme 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
Appuyer sur la forme d’onde Indique quand un utilisateur appuie sur un élément d’interface utilisateur interactif dans une action incrémentielle (voir Mise en production). 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 Appuyer). Facultatif
Forme d’onde de réussite Signal fort pour avertir l’utilisateur qu’une action a réussi. Facultatif
BuzzContinuous waveform Sensation de bourdonnement continu. Facultatif
Forme d’onde rumblecontinuous Sensation de grondement continu. Facultatif

Personnalisations des 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 jeux 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 case activée pour 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 de commentaires haptiques

Utilisez la méthode SendHapticFeedback de l’objet SimpleHapticsController pour passer des formes d’onde 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 passez une forme d’onde manuscrite pour configurer le stylet afin de commencer à lire cette forme d’onde dès que le bout du stylet touche n’importe où sur l’écran. La forme d’onde continue de jouer jusqu’à ce que le stylet soit levé ou que StopFeedback soit appelé, selon ce qui se produit en premier. Nous vous recommandons d’effectuer cette opération dans le gestionnaire d’événements PointerEntered pour l’élément dans lequel vous souhaitez lire les haptiques. 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 itérer 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.

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 que vous arrêtiez également les commentaires haptiques lorsque le pointeur associé quitte l’élément que vous avez inscrit pour le retour haptique. Sinon, la forme d’onde continuera à tenter de jouer sur le stylet actif.

Notes

Certains stylets peuvent éventuellement arrêter les haptiques eux-mêmes lorsque le stylet quitte la plage de l’écran. Toutefois, il n’est pas nécessaire que tous les stylets le fassent. Les applications doivent donc 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 des formes d’onde 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 passez une forme d’onde manuscrite pour configurer le stylet afin de commencer à lire cette forme d’onde immédiatement en fonction d’une certaine interaction au sein de votre application (au lieu de l’extrémité du stylet touche l’écran pour les commentaires d’entrée manuscrite).

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

Notes

L’envoi d’une forme d’onde d’interaction lorsqu’une forme d’onde 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 dans la collection SupportedFeedback de SimpleHapticsController, en vous assurant qu’elle est prise en charge par le stylet actif.

Si elle n’est pas prise en charge, vous pouvez choisir de ne rien lire du tout ou de revenir à la forme d’onde Click , car cela est garanti.

Dans l’exemple suivant, nous essayons d’envoyer la forme d’onde 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. La première est prise 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 case activée pour vous assurer 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 case activée pour vous assurer 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.

    Notes

    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 case activée pour vous assurer 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é.

    Notes

    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 pen haptique pour obtenir des exemples d’utilisation des fonctionnalités suivantes :