Pennans haptiska (taktila) återkoppling

Lär dig hur du använder haptisk feedback från pennenheter för att ge mer naturliga och taktila interaktioner i din Windows App SDK app.

Windows 11 introducerat haptisk feedback för digitala pennor, så att användarna kan känna hur pennan interagerar med appens användargränssnitt. När du refererar till den här funktionen används haptic i utvecklar-API:er och dokumentation, medan taktil är det användarinriktade namnet som visas i Windows Inställningar.

Nyckel-API:er

Haptiska feedbacktyper

Det finns två typer av haptisk feedback:

  • Respons för penninmatning — Simulerar känslan av skriv- eller ritverktyg (penna, märkpenna, blyertspenna, överstrykningspenna) genom kontinuerliga vibrationer medan pennan vidrör skärmen.
  • Interaktionsfeedback – Korta taktila signaler för användaråtgärder som att hovra över en knapp, klicka eller bekräfta en slutförd åtgärd.

Identifiera penningång

Registrera dig för PointerEntered händelsen och kontrollera om enhetstypen pekare är en penna:

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

    // Pen detected — check for haptic support.
}

Hämta PenDevice i Windows App SDK

I en Windows App SDK app använder du PenDeviceInterop – en Windows App SDK interop-klass – för att hämta WinRT-objektet PenDevice från en pekarpunkt. PenDevice, SimpleHapticsController, och KnownSimpleHapticsControllerWaveforms är WinRT-typer från Windows.Devices.Input namnrymderna ochWindows.Devices.Haptics. Endast själva interop-anropet kommer från Windows App SDK namnområdeMicrosoft.UI.Input.Interop:

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).
}

Anmärkning

Använd i stället i UWP-appar PenDevice.GetFromPointerId . Klassen PenDeviceInterop är specifik för Windows App SDK.

Bläckning av vågformer

Vågformer för bläckinmatning spelas upp kontinuerligt medan pennan är i kontakt med skärmen. Nödvändiga vågformer stöds garanterat av alla haptiska pennor.

Vågform Description Krävs
InkContinuous Standardkänsla som kulspetspenna. Reservlösning för vågformer som inte stöds. Yes
BrushContinuous Penselverktyget No
Kontinuerlig penna Pennverktyget No
Kontinuerlig markör Markörverktyg No
ChiselMarkerFortsätt Mejselmarkör/överstrykningspenna No
Kontinuerlig raderare Suddgummi No
GalaxyPenContinuous Specialbläck (flerfärgad pensel) No

Interaktionsvågformer

Interaktionsvågformer ger kort, direkt feedback för användargränssnittsåtgärder.

Vågform Description Krävs
Klicka Standard med kort klickning. Reservlösning för interaktioner som inte stöds. Yes
Error Åtgärden misslyckades eller så uppstod ett fel No
Hovra Började hovra över ett interaktivt element No
Tryck Tryckte på ett interaktivt element No
Lansering Släppte ett interaktivt element No
Success Åtgärden lyckades No
BuzzContinuous Kontinuerligt surrande No
RumbleContinuous Kontinuerligt mullrande No

Skicka haptisk feedback

Iterera igenom SupportedFeedback för att hitta önskad vågform och anropa SendHapticFeedbacksedan :

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);
}

Stäng av haptisk återkoppling

Stoppa alltid haptisk feedback när pekaren avslutar elementet. Registrera PointerExited på samma element:

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

Anmärkning

Vissa pennor stänger automatiskt av haptiken när pennan lämnar skärmen. Detta gäller dock inte alla pennor, så anropa alltid StopFeedback uttryckligen.

Anpassa haptisk feedback

Vissa pennor stöder ytterligare anpassningar. Kontrollera supporten innan du använder dem:

Property Kontrollera kompatibilitet med
Intensitet IsIntensitySupported
Antal uppspelningar IsPlayCountSupported
Uppspelningstid IsPlayDurationSupported
Pausintervall för återuppspelning IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}