Freigeben über


Stiftinteraktionen und haptisches (taktiles) Feedback

Windows unterstützt seit langem digitale Stifte, mit denen Benutzer auf natürliche, direkte Weise mit ihren Geräten interagieren und ihre Kreativität durch umfassende Schreib- und Zeichnungserfahrungen mit Digitaler Freihand ausdrücken können.

Mit Windows 11 wird eine neue Funktion eingeführt, mit der die digitale Stifterfahrung noch natürlicher und ansprechender wird: Bei Verwendung eines Stifts, der "haptisches Feedback" unterstützt, können Benutzer tatsächlich spüren, dass ihr Stift mit der Benutzeroberfläche einer App taktil interagiert.

Hinweis

Wenn Sie auf dieses neue Feature verweisen, wird "haptisch" während der gesamten Entwickler-APIs und zugehörige Dokumentation verwendet, während "taktil" der Anzeigename ist, der Benutzern zum Festlegen von Feedbackeinstellungen in den Windows-Einstellungen angezeigt wird.

Haptische Feedbackerfahrungen, die in Windows 11 unterstützt werden, umfassen Freihandfeedback und Interaktionsfeedback:

  • Freihandfeedback simuliert das Verhalten verschiedener Schreib- oder Zeichentools (z. B. Stift, Markierung, Bleistift, Textmarker usw.) durch kontinuierliche Vibrationen, während der Stift mit dem Bildschirm in Kontakt ist. Standardmäßig unterstützt die Windows Ink-Plattform haptisches Feedback für alle Zeichentools (in diesem Thema wird erläutert, wie Sie über die von Windows Ink unterstützte benutzerdefinierte Freihandlösung hinaus eine benutzerdefinierte Freihandlösung bereitstellen).
  • Interaktionsfeedback hingegen ist direktes Feedback, das auf wichtigen Benutzeraktionen basiert, z. B. das Daraufzeigen oder Klicken auf eine Schaltfläche, das Reagieren auf den Abschluss einer Aktion oder das Lenken der Aufmerksamkeit des Benutzers.

In der Regel sind fünf Schritte erforderlich, um haptisches Feedback vollständig zu unterstützen:

  • Stifteingabe erkennen.
  • Ermitteln Sie, ob der aktuelle Stift und das Gerät haptisches Feedback unterstützen und wenn ja, welche haptischen Feedbackfeatures unterstützt werden.
  • Entscheiden Sie sich für das haptische Feedbacksignal, das gesendet werden soll.
  • Senden Sie das haptische Feedback.
  • Beenden des haptischen Feedbacks

Erkennen der Stifteingabe

Um Stifteingaben zu erkennen und zu isolieren, müssen Sie sich zuerst für das PointerEntered-Ereignis registrieren und dann überprüfen, ob pointerDeviceType ein Stift ist.

Der folgende Code zeigt, wie sie den Zeigergerätetyp innerhalb eines PointerEntered-Ereignisses überprüfen. Wenn die Eingabe in diesem Beispiel nicht von einem Stift stammt, wird einfach vom Ereignishandler zurückgegeben. Andernfalls überprüfen wir die Stiftfunktionen und konfigurieren das haptische Feedback.


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

Ermitteln der Unterstützung für haptisches Feedback

Nicht alle Stifte und Digitalisierungselemente unterstützen haptisches Feedback, und die Stifte, die nicht unbedingt alle in diesem Thema beschriebenen haptischen Feedbackfeatures unterstützen. Daher ist es wichtig, programmgesteuert zu überprüfen, welche Features vom aktiven Stift unterstützt werden.

In einer Fortsetzung des vorherigen Beispiels zeigen wir, wie Sie überprüfen können, ob der aktive Stift haptisches Feedback unterstützt.

Wir versuchen zunächst, ein PenDevice-Objekt aus der aktuellen PointerId abzurufen. Wenn kein PenDevice abgerufen werden kann, wird einfach vom Ereignishandler zurückgegeben.

Wenn ein PenDevice abgerufen wurde, testen wir, ob es eine SimpleHapticsController-Eigenschaft unterstützt. Wenn dies nicht der Fall ist, wird einfach wieder vom Ereignishandler zurückgegeben.

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

Der im vorherigen Beispiel abgerufene SimpleHapticsController wird in nachfolgenden Beispielen verwendet, um haptische Funktionen abzufragen und haptisches Feedback zu senden/zu beenden.

Hinweis

Wenn Sie Apps mit dem Windows App SDK Preview 1.0 erstellen, können Sie penDevice interop (PenDeviceInterop.FromPointerPoint(PointerPoint)) verwenden, um auf das System PenDevice zuzugreifen.

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

In den folgenden Abschnitten werden die Feedbackfeatures beschrieben, die haptische Stifte unterstützen müssen, sowie diejenigen, die optional sind. Ein erforderlicher haptischer Feedbacktyp kann in der Regel als Fallback anstelle eines optionalen Features verwendet werden.

Freihandforms

Freihandforms werden kontinuierlich wiedergegeben, während der Stift mit dem Bildschirm in Kontakt ist, und versuchen Sie, das Gefühl verschiedener Schreib- oder Zeichentools zu simulieren.

Funktion Beschreibung Erforderlich/optional
InkContinous Waveform Simuliert das Gefühl der Tinte mit einem physischen Kugelschreiber. Dies ist der Standardfallback, wenn eine Freihandform von einem haptischen Stift nicht unterstützt wird. Erforderlich
BrushContinuous waveform Kontinuierliches haptisches Signal, wenn der Benutzer Pinsel als Freihandtool auswählt. Optional
ChiselMarkerContinuous Waveform Kontinuierliches haptisches Signal, wenn der Benutzer Chiselmarker/Textmarker als Freihandtool auswählt. Optional
EraserContinuous waveform Kontinuierliches haptisches Signal, wenn der Benutzer radierer als Freihandtool auswählt. Optional
GalaxyContinuous Waveform
(Die HID-Dokumentation und der Implementierungsleitfaden beziehen sich auf diese Wellenform als SparkleContinuous)
Kontinuierliches haptisches Signal für spezielle Freihandwerkzeuge, z. B. ein mehrfarbiger Pinsel. Optional
MarkerContinuous waveform Kontinuierliches haptisches Signal, wenn der Benutzer Markierung als Freihandtool auswählt. Optional
PencilContinuous waveform Kontinuierliches haptisches Signal, wenn der Benutzer Bleistift als Freihandtool auswählt. Optional

Interaktionswellenformen

Interaktionswellenforms sind in der Regel kurz (Ausnahmen in der folgenden Tabelle angegeben), direkte Feedbackwellenforms, die bei Bedarf generiert werden, um wichtige Aktionen zu bestätigen, z. B. das Daraufzeigen oder Klicken auf eine Schaltfläche, das Reagieren auf den Abschluss einer Aktion oder das Lenken der Aufmerksamkeit des Benutzers.

Funktion Beschreibung Erforderlich/optional
Klicken Sie auf Wellenform Ein kurzes "Klick"-Feedback. Dies ist der Standardfallback, wenn eine von der App ausgewählte Interaktionswelle von einem haptischen Stift nicht unterstützt wird. Erforderlich
Fehlerwellenform Ein starkes Signal, um den Benutzer darüber zu informieren, dass eine Aktion fehlgeschlagen ist oder ein Fehler aufgetreten ist. Optional
Hover waveform Gibt an, dass der Benutzer mit dem Daraufzeigen über ein interaktives UI-Element begonnen hat. Optional
Press waveform Gibt an, wann ein Benutzer ein interaktives UI-Element in einer inkrementellen Aktion drückt (siehe Release). Optional
Wellenform loslassen Gibt an, wann ein Benutzer ein interaktives UI-Element in einer inkrementellen Aktion loslässt (siehe Drücken). Optional
Erfolgswellenform Starkes Signal, um den Benutzer darüber zu informieren, dass eine Aktion erfolgreich war. Optional
BuzzContinuous waveform Kontinuierliches Summengefühl. Optional
RumbleContinuous Waveform Kontinuierliches Rumpeln. Optional

Haptische Feedbackanpassungen

Einige haptische Stifte können die folgenden Anpassungen unterstützen.

Funktion Beschreibung Erforderlich/optional
Intensität Legt die Intensität des haptischen Signals fest. Optional
Anzahl der Wiedergabe Wiederholt ein haptisches Signal, das eine bestimmte Anzahl von Malen hat. Optional
Pausenintervall der Wiedergabe Legt die Zeit zwischen jeder wiederholten Wiedergabe des haptischen Signals fest. Optional
Wiedergabedauer Legt das Zeitintervall fest, in dem ein haptisches Signal wiedergegeben wird. Optional

Überprüfen der Unterstützung für benutzerdefinierte Einstellungen

Verwenden Sie die folgenden Eigenschaften des SimpleHapticsController, um die Intensität zu überprüfen, "Wiedergabeanzahl", "Pausenintervall" und "Wiedergabedauer"-Unterstützung:

Senden und Beenden des haptischen Freihandfeedbacks

Verwenden Sie die SendHapticFeedback-Methode des SimpleHapticsController-Objekts , um Freihandformen an den Stift des Benutzers zu übergeben. Diese Methode unterstützt das Übergeben einer Wellenform oder einer Wellenform mit einem angepassten Intensitätswert (siehe Anpassen haptischer Feedback).

Rufen Sie SendHapticFeedback auf, und übergeben Sie eine Freihandform, um den Stift so zu konfigurieren, dass diese Wellenform wiedergegeben wird, sobald die Spitze des Stifts an einer beliebigen Stelle auf dem Bildschirm berührt wird. Die Wellenform wird weiterhin wiedergegeben, bis der Stift angehoben wird oder StopFeedback aufgerufen wird, je nachdem, was zuerst geschieht. Es wird empfohlen, dies im PointerEntered-Ereignishandler für das Element auszuführen, in dem Haptik wiedergegeben werden soll. Beispielsweise würde eine App mit einer benutzerdefinierten Freihandimplementierung dies in der PointerEntered-Methode des Freihandzeichenbereichs tun.

Um die gewünschte Freihandform abzurufen, müssen Sie die SupportedFeedback-Auflistung des SimpleHapticsController durchlaufen, um sicherzustellen, dass sie vom aktiven Stift unterstützt wird.

Wenn sie nicht unterstützt wird, können Sie entweder überhaupt nichts wiedergeben oder auf die InkContinuous-Wellenform zurückgreifen, da dies garantiert unterstützt wird.

Im folgenden Beispiel wird versucht, die BrushContinuous-Wellenform zu senden (aber zurück auf InkContinuous, wenn BrushContinuous nicht unterstützt wird).

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

Es ist wichtig, dass Sie auch haptisches Feedback beenden, wenn der zugeordnete Zeiger das Element verlässt, das Sie für haptisches Feedback registriert haben. Andernfalls versucht die Wellenform weiterhin, auf dem aktiven Stift zu spielen.

Hinweis

Einige Stifte können haptische Zeichen optional selbst beenden, wenn der Stift den Bildschirmbereich verlässt. Dies ist jedoch nicht für alle Stifte erforderlich, sodass Anwendungen das haptische Feedback wie hier beschrieben immer explizit beenden sollten.

Um haptisches Feedback für ein Element zu beenden, registrieren Sie sich für das PointerExited-Ereignis für dasselbe Element wie Sie den PointerEntered-Handler registriert haben, der das haptische Signal gesendet hat. Rufen Sie in diesem beendeten Ereignishandler "StopFeedback " auf, wie hier gezeigt.

hapticsController.StopFeedback();

Senden und Beenden von Interaktionsfeedback

Das Senden von Interaktionsfeedback ähnelt dem Senden von Freihandfeedback.

Verwenden Sie die SendHapticFeedback-Methode des SimpleHapticsController-Objekts , um Interaktionswellenformen an den Stift des Benutzers zu übergeben. Diese Methode unterstützt das Übergeben einer Wellenform oder einer Wellenform mit einem angepassten Intensitätswert (siehe Anpassen haptischer Feedback).

Rufen Sie SendHapticFeedback auf, und übergeben Sie eine Freihandform, um den Stift so zu konfigurieren, dass diese Wellenform sofort basierend auf einer Interaktion in Ihrer App wiedergegeben wird (statt wenn die Spitze des Stifts den Bildschirm für Freihandfeedback berührt).

Bei Verwendung einer der nicht fortlaufenden Interaktionswellenformen ist es nicht erforderlich, einen entsprechenden StopFeedback-Aufruf durchzuführen. Sie müssen "StopFeedback" weiterhin für die fortlaufenden Interaktionswellenformen aufrufen.

Hinweis

Durch das Senden einer Interaktionswellenform, wenn eine Freihandform wiedergegeben wird, wird die Freihandform vorübergehend unterbrochen. Die Freihandwellenform wird fortgesetzt, wenn die Interaktionswellenform anhält.

Um die gewünschte Interaktionswellenform abzurufen, müssen Sie die SupportedFeedback-Auflistung des SimpleHapticsController durchlaufen, um sicherzustellen, dass sie vom aktiven Stift unterstützt wird.

Wenn sie nicht unterstützt wird, können Sie entweder überhaupt nichts wiedergeben oder auf die Click Waveform zurückgreifen, da dies garantiert unterstützt wird.

Im folgenden Beispiel wird versucht, die Fehlerwellenform zu senden (aber zurück auf Click, wenn Fehler nicht unterstützt wird).

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

Anpassen des haptischen Feedbacks

Es gibt drei Möglichkeiten, haptisches Feedback anzupassen. Die erste wird sowohl von Freihand- als auch von Interaktionsfeedback unterstützt, während der zweite und dritte nur von Interaktionsfeedback unterstützt werden.

  1. Passen Sie die Intensität des Feedbacks relativ zur Einstellung der maximalen Systemintensität an. Dazu müssen Sie zuerst überprüfen, ob der SimpleHapticsController das Festlegen der Intensität unterstützt, und dann SendHapticFeedback mit dem gewünschten Intensity Wert aufrufen.

    if (hapticsController.IsIntensitySupported) 
    {
        foreach (var waveform in hapticsController.SupportedFeedback)
        {
            if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click)
            {
                double intensity = 0.75;
                hapticsController.SendHapticFeedback(waveform, intensity);
            }
        }
    }
    
  2. Wiederholen Sie das haptische Signal eine bestimmte Anzahl von Malen. Dazu müssen Sie zuerst überprüfen, ob der SimpleHapticsController das Festlegen der Intensität unterstützt, und dann SendHapticFeedbackForPlayCount mit dem gewünschten Zählerwert aufrufen. Sie können auch die Intensität und das Pausenintervall für die Wiedergabe festlegen.

    Hinweis

    Wenn der SimpleHapticsController das Festlegen der Intensität oder des Pausenintervalls für die Wiedergabe nicht unterstützt, werden die angegebenen Werte ignoriert.

    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. Legen Sie die Dauer des haptischen Signals fest. Dazu müssen Sie zuerst überprüfen, ob der SimpleHapticsController das Festlegen der Wiedergabedauer unterstützt, und dann SendHapticFeedbackForDuration mit dem gewünschten Zeitintervallwert aufrufen. Sie können auch die Intensität festlegen.

    Hinweis

    Wenn der SimpleHapticsController das Festlegen der Intensität nicht unterstützt, wird der angegebene Wert ignoriert.

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

Beispiele

Sehen Sie sich das Beispiel für Pen-Haptik an, um Beispiele für die folgenden Funktionen zu verwenden: