Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 bereichernde Schreib- und Zeichenerfahrungen mit digitaler Tinte 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" in den gesamten Entwickler-APIs und der zugehörigen Dokumentation verwendet, während "taktil" der Anzeigename ist, der Benutzern zum Anpassen der Feedbackeinstellungen in den Windows-Einstellungen angezeigt wird.
Haptische Feedback-Erfahrungen, die in Windows 11 unterstützt werden, umfassen Freihand-Feedback und Interaktions-Feedback.
- Während der Stift mit dem Bildschirm in Kontakt ist, simuliert das Inking-Feedback das Gefühl verschiedener Schreib- oder Zeichentools (z. B. Stift, Marker, Bleistift, Textmarker usw.) durch kontinuierliche Vibrationen. Standardmäßig unterstützt die Windows Ink-Plattform haptisches Feedback für alle Zeichentools (in diesem Thema wird behandelt, wie Sie eine benutzerdefinierte Freihandlösung bereitstellen können, die über die von Windows Ink unterstützten Funktionen hinausgeht).
- Interaktionsfeedback hingegen ist direktes Feedback, das auf wichtigen Benutzeraktionen basiert, wie z. B. das Bewegen des Cursors über oder Klicken auf eine Schaltfläche, das Feedback auf den Abschluss einer Aktion, oder um die Aufmerksamkeit des Benutzers zu lenken.
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 Digitizer unterstützen haptisches Feedback, und die Stifte, die dies tun, unterstützen möglicherweise nicht alle im Thema beschriebenen Funktionen des haptischen Feedbacks. 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. Falls nicht, kehren wir einfach wieder vom Ereignishandler zurück.
// 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.
Eingabewellenformen
Inking-Wellenformen laufen kontinuierlich ab, während der Stift mit dem Bildschirm in Kontakt ist, und versuchen, das Gefühl verschiedener Schreib- oder Zeichengeräte zu simulieren.
| Merkmal | Description | Erforderlich/Optional |
|---|---|---|
| InkKontinuierliche Wellenform | Simuliert das Schreibgefühl mit einem echten Kugelschreiber. Dies ist die Standardlösung, wenn eine Tintenwellenform von einem haptischen Stift nicht unterstützt wird. | Erforderlich |
| BrushContinuous-Wellenform | Kontinuierliches haptisches Signal, wenn der Benutzer einen Pinsel als Freihandwerkzeug auswählt. | Wahlfrei |
| ChiselMarkerContinuous Wellenform | Kontinuierliches haptisches Signal, wenn der Benutzer Keilspitze-Marker/Textmarker als Zeichenwerkzeug auswählt. | Wahlfrei |
| Eraser kontinuierliche Wellenform | Kontinuierliches haptisches Signal, wenn der Benutzer Radierer als Zeichenwerkzeug auswählt. | Wahlfrei |
| GalaxyKontinuierliche Wellenform (Die HID-Dokumentation und der Implementierungsleitfaden beziehen sich auf diese Wellenform als SparkleContinuous) |
Kontinuierliches haptisches Signal für spezielle Tintengeräte, z. B. einen mehrfarbigen Pinsel. | Wahlfrei |
| MarkerKontinuierliche Wellenform | Kontinuierliches haptisches Signal, wenn der Benutzer Stift als Freihandzeichnungswerkzeug auswählt. | Wahlfrei |
| PencilContinuous waveform | Kontinuierliches haptisches Signal, wenn der Benutzer den Stift als Stift-Tool auswählt. | Wahlfrei |
Interaktionswellenformen
Interaktionswellenformen sind in der Regel kurz (Ausnahmen sind in der folgenden Tabelle angegeben), direkte Feedbackwellenformen, die bei Bedarf generiert werden, um wichtige Aktionen zu bestätigen, wie etwa das Zeigen oder Klicken auf eine Schaltfläche, das Reagieren auf den Abschluss einer Aktion oder um die Aufmerksamkeit des Benutzers zu lenken.
| Merkmal | Description | 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. | Wahlfrei |
| Schwebe-Wellenform | Gibt an, dass der Benutzer begonnen hat, über ein interaktives Element der Benutzeroberfläche zu fahren. | Wahlfrei |
| Wellenform drücken | Gibt an, wann ein Benutzer ein interaktives UI-Element in einer inkrementellen Aktion drückt (siehe Release). | Wahlfrei |
| Wellenform veröffentlichen | Gibt an, wann ein Benutzer ein interaktives UI-Element in einer inkrementellen Aktion loslässt (siehe Drücken). | Wahlfrei |
| Erfolgswellenform | Starkes Signal, um den Benutzer darüber zu informieren, dass eine Aktion erfolgreich war. | Wahlfrei |
| BuzzContinuous Wellenform | Kontinuierliches Summenempfinden. | Wahlfrei |
| RumbleContinuous Wellenform | Kontinuierliche Rumpelgeräusche. | Wahlfrei |
Haptische Feedbackanpassungen
Einige haptische Stifte können die folgenden Anpassungen unterstützen.
| Merkmal | Description | Erforderlich/Optional |
|---|---|---|
| Intensität | Legt die Intensität des haptischen Signals fest. | Wahlfrei |
| Anzahl der Wiedergaben | Wiederholt ein haptisches Signal eine bestimmte Anzahl von Malen. | Wahlfrei |
| Pausenintervall der Wiedergabe | Legt die Zeit zwischen jeder wiederholten Wiedergabe des haptischen Signals fest. | Wahlfrei |
| Wiedergabedauer | Legt das Zeitintervall fest, in dem ein haptisches Signal wiedergegeben wird. | Wahlfrei |
Überprüfen der Unterstützung für benutzerdefinierte Einstellungen
Verwenden Sie die folgenden Eigenschaften des SimpleHapticsController, um die Unterstützung für Intensität, Wiedergabeanzahl, Pausenintervall und Wiedergabedauer zu überprüfen:
Senden und Beenden des digitalen Zeichnens mit haptischem Feedback
Verwenden Sie die SendHapticFeedback-Methode des SimpleHapticsController-Objekts, um Tintenwellenformen 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 des haptischen Feedbacks).
Rufen Sie SendHapticFeedback auf und übergeben Sie eine Inking-Wellenform, damit der Stift so konfiguriert wird, dass diese Wellenform abgespielt wird, sobald die Stiftspitze an einer beliebigen Stelle auf den Bildschirm trifft. 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 Methode "PointerEntered" ihrer Zeichenfläche tun.
Um die gewünschte Eingabewellenform abzurufen, müssen Sie die SupportedFeedback-Auflistung des SimpleHapticsController durchlaufen und sicherstellen, dass sie vom aktiven Stift unterstützt wird.
Wenn es nicht unterstützt wird, können Sie entweder überhaupt nichts wiedergeben oder auf die InkContinuous-Wellenform ausweichen, da diese 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 das haptische Feedback von selbst abschalten, 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 ist ganz ähnlich wie das 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 des haptischen Feedbacks).
Rufen Sie SendHapticFeedback auf und übergeben Sie eine Freihand-Wellenform, um den Stift so zu konfigurieren, dass er diese Wellenform sofort basierend auf einer Interaktion in Ihrer App abspielt (statt wenn die Spitze des Stifts den Bildschirm zur Freihand-Rückmeldung berührt).
Bei Verwendung einer der nicht fortlaufenden Interaktionswellenformen ist es nicht erforderlich, einen entsprechenden StopFeedback-Aufruf durchzuführen. Sie müssen weiterhin StopFeedback für die kontinuierlichen Interaktions-Wellenformen aufrufen.
Hinweis
Durch das Senden eines Interaktionssignals während der Wiedergabe einer Eingabewellenform wird diese vorübergehend unterbrochen. Die Freihandwellenform wird wiederaufgenommen, wenn die Interaktionswellenform stoppt.
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 die Wellenform nicht unterstützt wird, können Sie entweder überhaupt nichts wiedergeben oder auf die Click-Wellenform zurückgreifen, da sie garantiert unterstützt wird.
Im folgenden Beispiel versuchen wir, die Fehlerwellenform zu senden. Falls Fehler nicht unterstützt wird, erfolgt ein Rückgriff auf Click.
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 durch Freihand- als auch durch Interaktionsfeedback unterstützt, während das zweite und das dritte nur durch Interaktionsfeedback unterstützt werden.
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
IntensityWert aufrufen.if (hapticsController.IsIntensitySupported) { foreach (var waveform in hapticsController.SupportedFeedback) { if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.Click) { double intensity = 0.75; hapticsController.SendHapticFeedback(waveform, intensity); } } }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); } } }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); } } }
Examples
Sehen Sie sich das Beispiel für Pen-Haptik an, um funktionierende Beispiele der folgenden Funktionen zu sehen.
- Rufen Sie einen SimpleHapticsController von der Stifteingabe ab: Wechseln Sie von PointerId zu PenDevice zu SimpleHapticsController (erfordert sowohl einen haptisch-fähigen Stift als auch ein Gerät, das den Stift unterstützt).
- Überprüfen sie die Haptikfunktionen des Stifts: Ein SimpleHapticsController macht Eigenschaften für Stifthardwarefunktionen verfügbar, einschließlich IsIntensitySupported, IsPlayCountSupported, SupportedFeedback usw.
- Starten und beenden Sie haptisches Feedback: Verwenden Sie die Methoden SendHapticFeedback und StopFeedback entsprechend.
- Lösen Sie haptisches Feedback aus: Feedback sowohl für Freihandfeedback als auch für Interaktionsfeedback.
Windows developer