Retorno háptico (tátil) da caneta

Saiba como usar comentários hápticos de dispositivos de caneta para fornecer interações mais naturais e táteis em seu aplicativo SDK do Aplicativo Windows.

Windows 11 introduziu comentários hápticos para canetas digitais, permitindo que os usuários sintam a caneta interagindo com a interface do usuário do aplicativo. Ao se referir a esse recurso, haptic é usado em APIs e na documentação para desenvolvedores, enquanto Tátil é o nome voltado ao usuário exibido nas Configurações do Windows.

APIs de chave

Tipos de retorno háptico

Dois tipos de comentários hápticos estão disponíveis:

  • Resposta tátil da tinta digital — Simula a sensação de ferramentas de escrita ou desenho (caneta, marcador, lápis, marca-texto) por meio de vibrações contínuas enquanto a caneta está em contato com a tela.
  • Comentários de interação — sinais táteis curtos para ações do usuário, como passar o mouse sobre um botão, clicar ou confirmar uma ação concluída.

Detectar entrada de caneta

Registre-se para o PointerEntered evento e verifique se o tipo de dispositivo de ponteiro é uma caneta:

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

    // Pen detected — check for haptic support.
}

Obter o PenDevice no SDK do Aplicativo Windows

Em um aplicativo do SDK do Aplicativo Windows, use PenDeviceInterop — uma classe de interoperabilidade do SDK do Aplicativo Windows — para obter o objeto WinRT PenDevice a partir de um ponto de ponteiro. PenDevice, SimpleHapticsController e KnownSimpleHapticsControllerWaveforms são tipos WinRT dos namespaces Windows.Devices.Input e Windows.Devices.Haptics; somente a própria chamada de interoperabilidade vem do namespace Microsoft.UI.Input.Interop do SDK do Aplicativo 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).
}

Observação

Em aplicativos UWP, use PenDevice.GetFromPointerId em vez disso. A PenDeviceInterop classe é específica para o SDK do Aplicativo Windows.

Formas de onda de escrita à tinta

As formas de onda de tinta são exibidas continuamente enquanto a caneta estiver em contato com a tela. As formas de onda necessárias têm suporte garantido em qualquer caneta háptica.

Forma de onda Description Obrigatório
InkContinuous Sensação padrão de caneta esferográfica. Alternativa para formas de onda não compatíveis. Yes
BrushContinuous Ferramenta de pincel No
PencilContinuous Ferramenta de lápis No
MarkerContinuous Ferramenta de marcação No
ChiselMarkerContinuous Marcador chanfrado/marca-texto No
EraserContinuous Ferramenta Borracha No
GalaxyPenContinuous Tinta especial (pincel multicolorido) No

Formas de onda de interação

As animações onduladas de interação fornecem feedback curto e direto para ações na interface do usuário.

Forma de onda Description Obrigatório
Click Clique curto padrão. Alternativa para interações sem suporte. Yes
Erro Falha na ação ou erro ocorreu No
Focalizar Começou a passar o mouse sobre um elemento interativo No
Imprensa Pressionou um elemento interativo No
Liberação Lançou um elemento interativo No
Êxito Ação bem-sucedida No
BuzzContinuous Zumbido contínuo No
RumbleContinuous Ruído contínuo No

Enviar comentários hápticos

Percorra SupportedFeedback para encontrar a forma de onda desejada e, em seguida, chame 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);
}

Parar comentários hápticos

Sempre interrompa o feedback háptico quando o ponteiro deixar o elemento. Registro de PointerExited no mesmo elemento:

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

Observação

Algumas canetas param os hápticos automaticamente quando a caneta sai da tela. No entanto, nem todas as canetas fazem isso, então sempre chame StopFeedback explicitamente.

Personalizar comentários hápticos

Algumas canetas dão suporte a personalizações adicionais. Verifique o suporte antes de usá-los:

Propriedade Verifique a compatibilidade com
Intensidade IsIntensitySupported
Contagem de reproduções IsPlayCountSupported
Duração da reprodução IsPlayDurationSupported
Intervalo de pausa da repetição IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}