Retour haptique (tactile) du stylet

Découvrez comment utiliser les commentaires haptiques des appareils de stylet pour fournir des interactions plus naturelles et tactiles dans votre application SDK d'application Windows.

Windows 11 introduit des commentaires haptiques pour les stylos numériques, ce qui permet aux utilisateurs de sentir leur stylet interagir avec l'interface utilisateur de l'application. Lorsque vous faites référence à cette fonctionnalité, haptic est utilisé dans les API et la documentation des développeurs, tandis que tactile est le nom accessible par l’utilisateur affiché dans Windows Paramètres.

API clés

Types de commentaires haptiques

Deux types de commentaires haptiques sont disponibles :

  • Commentaires manuscrits : simule la sensation des instruments d’écriture ou de dessin (stylet, marqueur, crayon, surligneur) par l'intermédiaire de vibrations continues pendant que le stylet touche l’écran.
  • Commentaires d’interaction : signaux tactiles courts pour les actions utilisateur telles que le pointage sur un bouton, le clic ou la confirmation d’une action terminée.

Détecter les entrées de stylet

Inscrivez-vous à l’événement PointerEntered et vérifiez si le type d’appareil de pointeur est un stylet :

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    // Pen detected — check for haptic support.
}

Obtenir le PenDevice dans la SDK d'application Windows

Dans une application SDK d'application Windows, utilisez PenDeviceInterop une classe d’interopérabilité SDK d'application Windows pour obtenir l’objet WinRT PenDevice à partir d’un point de pointeur. PenDevice, SimpleHapticsController et KnownSimpleHapticsControllerWaveforms sont des types WinRT issus des espaces de noms Windows.Devices.Input et Windows.Devices.Haptics ; seul l'appel d'interopérabilité lui-même provient de l'espace de noms Microsoft.UI.Input.Interop du SDK d’application Windows :

using Microsoft.UI.Input.Interop;
using Windows.Devices.Haptics;
using Windows.Devices.Input;
using Windows.Foundation.Metadata;

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    var penDevice = PenDeviceInterop.FromPointerPoint(e.GetCurrentPoint(null));

    if (penDevice == null)
    {
        return; // Pen does not support advanced features.
    }

    // SimpleHapticsController requires Windows 11. Check for API presence
    // before accessing it so the app doesn't throw on Windows 10.
    if (!ApiInformation.IsPropertyPresent(
        "Windows.Devices.Input.PenDevice", "SimpleHapticsController"))
    {
        return; // Haptic feedback requires Windows 11.
    }

    var hapticsController = penDevice.SimpleHapticsController;
    if (hapticsController == null)
    {
        return; // Pen does not support haptic feedback.
    }

    // Configure haptic feedback (see examples below).
}

Note

Dans les applications UWP, utilisez PenDevice.GetFromPointerId plutôt. La PenDeviceInterop classe est spécifique au SDK d'application Windows.

Formes d’ondes manuscrites

Les formes d’onde d’encrage s’affichent en continu tant que le stylet est en contact avec l’écran. Les formes d’onde requises sont garanties d’être prises en charge par n’importe quel stylet haptique.

Forme d'onde Descriptif Obligatoire
InkContinuous Sensation de stylo à bille par défaut. Solution de secours pour les formes d’onde non prises en charge. Oui
BrushContinuous Pinceau Non
PencilContinuous Outil Crayon Non
MarkerContinuous Outil marqueur Non
ChiselMarkerContinuous Surligneur/marqueur Chisel Non
EraserContinuous Gomme Non
GalaxyPenContinuous Encre spéciale (pinceau multicolore) Non

Formes d’ondes d’interaction

Les formes d’ondes d’interaction fournissent des commentaires courts et directs pour les actions de l’interface utilisateur.

Forme d'onde Descriptif Obligatoire
Click Clic court par défaut Solution de repli pour les interactions non prises en charge. Oui
Error L’action a échoué ou une erreur s’est produite Non
Survoler Début du survol d’un élément interactif Non
Presse Appuyez sur un élément interactif Non
Libération Publication d’un élément interactif Non
Success Action réussie Non
BuzzContinuous Bourdonnement continu Non
RumbleContinuous Vrombissement continu Non

Envoyer des commentaires haptiques

Itérer à travers SupportedFeedback pour trouver la forme d’onde souhaitée, puis appeler SendHapticFeedback:

SimpleHapticsControllerFeedback currentWaveform = null;

// Try to use BrushContinuous, fall back to InkContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
    {
        currentWaveform = waveform;
        break;
    }
}

if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
        {
            currentWaveform = waveform;
            break;
        }
    }
}

if (currentWaveform != null)
{
    hapticsController.SendHapticFeedback(currentWaveform);
}

Arrêter les commentaires haptiques

Arrêtez toujours les commentaires haptiques lorsque le pointeur quitte l’élément. Inscrivez-vous pour PointerExited sur le même élément :

private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
    hapticsController?.StopFeedback();
}

Note

Certains stylos arrêtent automatiquement les haptiques lorsque le stylet quitte l’écran. Toutefois, tous les stylos ne le font pas, donc appelez StopFeedback toujours explicitement.

Personnaliser les commentaires haptiques

Certains stylos prennent en charge des personnalisations supplémentaires. Vérifiez la prise en charge avant de les utiliser :

Propriété Vérifier la compatibilité avec
Intensité IsIntensitySupported
Nombre de lectures IsPlayCountSupported
Durée de lecture IsPlayDurationSupported
Intervalle de pause de répétition IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}