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.
In diesem Artikel wird erläutert, wie Sie Ihrer Windows-App haptisches Feedback mithilfe der InputHapticsManager-API hinzufügen, einschließlich Codebeispiele für allgemeine Interaktionsmuster.
Designanleitungen zu wann und warum Haptik verwendet werden soll, finden Sie in den Designrichtlinien für Haptik.
Unterstützte Geräte
Haptik wird auf Eingabegeräten wie Mäusen, Touchpads und Stiften unterstützt. Die Verfügbarkeit variiert je nach Modell und Hersteller. Überprüfen Sie immer zur Laufzeit, ob Unterstützung verfügbar ist, bevor Sie Haptik-APIs aufrufen (siehe Unterstützung prüfen unten).
Anforderungen
| Anforderung | Details |
|---|---|
| Namespace | Windows.Devices.Haptics |
| Mindestbetriebssystem | Windows 11, SDK 10.0.28000.1721 (März 2026) |
| Ausrichten / Kollision / Stufe / Wachstum Wellenformen | SDK 10.0.28000.1839 (April 2026) |
| API-Vertrag |
UniversalApiContract Version 19.0 |
Um frühere Betriebssystemversionen zu unterstützen, verwenden Sie ApiInformation.IsTypePresent, um alle Aufrufe abzusichern (siehe Code unten).
Auf Unterstützung prüfen
Stellen Sie immer sicher, dass die API verfügbar ist und dass ein haptisches Gerät vorhanden ist, bevor sie verwendet wird. Die API ist in älteren Betriebssystemversionen nicht vorhanden, und nicht alle Eingabegeräte unterstützen Haptik.
using Windows.Devices.Haptics;
using Windows.Foundation.Metadata;
// Guard against older OS versions where the API is absent.
bool apiPresent = ApiInformation.IsTypePresent("Windows.Devices.Haptics.InputHapticsManager");
// Check that a supported haptic device is connected.
bool supported = apiPresent && InputHapticsManager.IsSupported();
Auslösen einer Wellenform
Rufen Sie InputHapticsManager.GetForCurrentThread() den UI-Thread auf, um eine Managerinstanz abzurufen, die auf den Eingabefokus des aktuellen Threads ausgerichtet ist. Geräteerkennung und -routing werden automatisch behandelt – Sie müssen keine Geräte selbst auflisten.
using Windows.Devices.Haptics;
if (supported)
{
var mgr = InputHapticsManager.GetForCurrentThread();
// The second parameter is a fallback waveform used if the first is
// unsupported. Passing 0 lets the system choose a device-appropriate
// fallback. TrySendHapticWaveform returns false if neither waveform is
// supported; this is a non-fatal condition.
bool sent = mgr.TrySendHapticWaveform(
KnownSimpleHapticsControllerWaveforms.Align,
0);
}
Wichtig
Aufrufen GetForCurrentThread() aus dem UI-Thread (oder dem Thread, der den Eingabefokus besitzt). Das Aufrufen aus einem Hintergrundthread leitet kein Feedback an das richtige Gerät weiter.
Wiedergabe beenden
Rufen Sie TryStopFeedback auf, wenn ein Ziehen oder eine Interaktion endet, um eine laufende haptische Wiedergabe anzuhalten.
using Windows.Devices.Haptics;
if (supported)
{
InputHapticsManager
.GetForCurrentThread()
.TryStopFeedback();
}
Implementierungsbeispiele
Objektausrichtung
Ausrichtungsleitlinien sind in Entwurfstools, Präsentations-Editoren und Diagramm-Apps üblich. Haptisches Feedback fügt einen zweiten Kanal hinzu, sodass Benutzer das Gefühl haben können, wenn Objekte an der Stelle einrasten – wodurch die Notwendigkeit reduziert wird, die Ausrichtung visuell zu bestätigen.
Wann auslösen: Verwenden Sie das Erscheinen der Ausrichtungshilfe als Auslöser. Wenn Ihre Einrastlogik eine Hilfslinie anzeigt, lösen Sie das haptische Feedback aus. Wenn keine Führungslinie angezeigt wird, lösen Sie nicht aus. Dadurch bleiben haptische Ereignisse eng gekoppelt mit sichtbaren Systemfeedback.
Vermeiden Sie Duplikate: Eine Form kann gleichzeitig an mehreren Führungslinien ausgerichtet werden (z. B. an der linken und oberen Kante). Behandeln Sie dies als eine einzige Interaktion – verfolgen Sie aktive Anleitungen und lösen Sie nur aus, wenn eine neue Anleitung erscheint.
using Windows.Devices.Haptics;
private readonly HashSet<int> _activeGuides = new();
// Call this after computing which alignment guides are currently visible.
void OnGuidesUpdated(IEnumerable<int> currentGuideIds)
{
var currentGuides = currentGuideIds.ToHashSet();
bool hasNewGuide = currentGuides.Except(_activeGuides).Any();
// Update the tracked set in place (field is readonly).
_activeGuides.Clear();
_activeGuides.UnionWith(currentGuides);
if (hasNewGuide && supported)
{
InputHapticsManager.GetForCurrentThread()
.TrySendHapticWaveform(
KnownSimpleHapticsControllerWaveforms.Align,
0);
}
}
Sliders
Haptik verbessert Schiebereglerinteraktionen durch Verankern von Feedback an aussagekräftige Positionen. Binden Sie immer Feedback an sichtbare Markierungen, die der Benutzer verstehen kann – Teilstriche, benannte Werte oder Bereichsgrenzen.
Wann auslösen: Haptik auslösen, wenn der Daumen jede Markierung überquert. Vermeiden Sie fortlaufende Rückmeldung zwischen den Teilstrichen, was ablenkend wirken kann.
using Windows.Devices.Haptics;
double _previousValue;
const double TickInterval = 25.0;
void OnSliderValueChanged(double newValue)
{
int previousTick = (int)(_previousValue / TickInterval);
int currentTick = (int)(newValue / TickInterval);
if (currentTick != previousTick && supported)
{
InputHapticsManager.GetForCurrentThread()
.TrySendHapticWaveform(
KnownSimpleHapticsControllerWaveforms.Step,
0);
}
_previousValue = newValue;
}
Das Erlebnis verfeinern: Passen Sie die haptische Intensität entsprechend der Schiebereglerposition an, damit Benutzer spüren, wo sie sich innerhalb des Bereichs befinden. Verwenden Sie TrySendHapticWaveformForPlayCount, um einen expliziten Intensitätswert von 0.0 bis 1.0 anzugeben.
void OnSliderValueChangedWithIntensity(double newValue, double maxValue)
{
int previousTick = (int)(_previousValue / TickInterval);
int currentTick = (int)(newValue / TickInterval);
if (currentTick != previousTick && supported)
{
double intensity = newValue / maxValue; // Scale 0.0–1.0
InputHapticsManager.GetForCurrentThread()
.TrySendHapticWaveformForPlayCount(
KnownSimpleHapticsControllerWaveforms.Step,
0, // fallback waveform
intensity,
1, // playCount
TimeSpan.Zero);
}
_previousValue = newValue;
}
Ziehinteraktionen und Absichtserkennung
Während eines Ziehens kann ein Objekt viele Ausrichtungsgrenzen überschreiten – Seitenmitte, Führungslinien, andere Objekte. Das Auslösen von haptischem Feedback bei jedem Überschreiten kann Benutzer überfordern, insbesondere bei schnellen Bewegungen, wenn sie sich lediglich neu positionieren, anstatt eine präzise Eingabe anzustreben.
Verwenden Sie Intent-Erkennung, um Feedback nur dann auszulösen, wenn der Benutzer bewusst eine Ausrichtung vornehmen will und nicht nur darüber hinweggeht.
Ansatz 1: Geschwindigkeitsfilter
Unterdrücken Sie Haptik, wenn sich der Cursor schnell bewegt, reservieren Sie Feedback für langsamere, bewusstere Bewegungen.
- Stabilisieren Sie das Signal. Vermeiden Sie die Verwendung von unformatierten Cursordelta, die für Eingabetypen, DPI-Einstellungen und Anzeigekonfigurationen laut sein können. Normalisieren und glätten Sie das Signal.
- Wählen Sie einen Schwellenwert sorgfältig aus. Prüfen Sie mit verschiedenen Geräten, Eingabetypen, Anzeige-Skalierungen und Mehrbildschirmkonfigurationen.
Ansatz 2: Timer-Entprellung
Wenn ein Objekt in eine Trigger-Zone eintritt, starten Sie einen kurzen Timer (50 ms sind ein vernünftiger Ausgangspunkt). Wenn das Objekt in der Zone bleibt, wenn der Timer abläuft, werten Sie dies als absichtlich und lösen Sie das haptische Feedback aus. Wenn das Objekt vor dem Auslösen des Timers aktiviert wird, unterdrücken Sie das Feedback.
- Einfacher zu implementieren und tendiert dazu, ein stabileres Verhalten zu erzeugen als die Geschwindigkeitsfilterung.
- Eine Verzögerung von 50 ms ist lang genug, um eine bewusste Ausrichtung von einem schnellen Vorbeiführen zu unterscheiden, und bleibt dabei unterhalb der Schwelle wahrnehmbarer Latenz.
using System;
using Microsoft.UI.Xaml;
using Windows.Devices.Haptics;
private DispatcherTimer? _alignTimer;
void OnObjectEnteredAlignmentZone()
{
_alignTimer?.Stop();
_alignTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) };
_alignTimer.Tick += (_, _) =>
{
_alignTimer.Stop();
if (supported)
{
InputHapticsManager.GetForCurrentThread()
.TrySendHapticWaveform(
KnownSimpleHapticsControllerWaveforms.Align,
0);
}
};
_alignTimer.Start();
}
void OnObjectLeftAlignmentZone()
{
_alignTimer?.Stop();
}
Auswählen zwischen den beiden
| Geschwindigkeitsfilter | Timer-Entprellung | |
|---|---|---|
| So funktioniert es | Reaktiv – Misst bewegung in Echtzeit | Predictive – wartet kurz, um die Absicht zu bestätigen |
| Fühlen | Kann sich direkter anfühlen | Etwas verzögert, aber konsistenter |
| Optimierungsaufwand | Höher – erfordert eine sorgfältige Kalibrierung | Niedriger – ein einzelner Verzögerungswert ist in der Regel ausreichend. |
| Empfohlen für | Apps, die ein sehr reaktionsfähiges Feedback erfordern | Die meisten Apps; guter Standardstartpunkt |
Verwandte Artikel
Windows developer