Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek vysvětluje, jak do aplikace Windows přidat haptickou zpětnou vazbu pomocí rozhraní API InputHapticsManager, včetně příkladů kódu pro běžné vzory interakce.
Pokyny k návrhu, kdy a proč používat haptika, najdete v pokynech k návrhu haptik.
Podporovaná zařízení.
Haptika se podporuje na vstupních zařízeních, jako jsou myši, touchpady a pera. Dostupnost se liší podle modelu a výrobce. Před voláním rozhraní API pro haptika vždy zkontrolujte podporu za běhu (viz Kontrola podpory níže).
Requirements
| Requirement | Podrobnosti |
|---|---|
| Namespace | Windows.Devices.Haptics |
| Minimální operační systém | Windows 11, SDK 10.0.28000.1721 (březen 2026) |
| Zarovnat / Kolize / Schod / Růst průběhů | SDK 10.0.28000.1839 (duben 2026) |
| Kontrakt rozhraní API |
UniversalApiContract verze 19.0 |
Pokud chcete cílit na starší verze operačního systému, použijte ApiInformation.IsTypePresent ochranu všech volání (viz níže uvedený kód).
Kontrola podpory
Před použitím vždy ověřte, že rozhraní API je k dispozici a že je k dispozici haptické zařízení. Rozhraní API není k dispozici ve starších verzích operačního systému a ne všechna vstupní zařízení podporují haptika.
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();
Aktivace vlnového tvaru
Zavolejte InputHapticsManager.GetForCurrentThread() ve vlákně uživatelského rozhraní, abyste získali instanci správce vázanou na vstupní fokus aktuálního vlákna. Zjišťování a směrování zařízení se zpracovává automaticky – nemusíte vytvářet výčet zařízení sami.
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);
}
Important
Zavolejte GetForCurrentThread() z vlákna uživatelského rozhraní (nebo z vlákna, které má fokus vstupu). Pokud ji zavoláte z vlákna běžícího na pozadí, zpětná vazba nebude směrována na správné zařízení.
Zastavit přehrávání
Zavolejte TryStopFeedback, když přetažení nebo interakce skončí, abyste zastavili jakékoli probíhající haptické přehrávání.
using Windows.Devices.Haptics;
if (supported)
{
InputHapticsManager
.GetForCurrentThread()
.TryStopFeedback();
}
Příklad implementace
Zarovnání objektů
Zarovnávací vodítka jsou běžnou součástí návrhových nástrojů, editorů prezentací a diagramovacích aplikací. Haptická zpětná vazba přidává druhý kanál, takže uživatelé mohou pocítit, když objekty zacvaknou na místo, což snižuje potřebu přibližovat obraz kvůli vizuálnímu potvrzení zarovnání.
Kdy se spustí: Jako spouštěč použijte zobrazení vodítka zarovnání. Když logika přichytávání zobrazí vodítko, spusťte haptickou odezvu. Pokud se nezobrazí žádné vodítko, nestřílejte. Díky tomu jsou haptické události těsně propojené s viditelnou systémovou odezvou.
Zabraňte duplicitám: Tvar lze současně zarovnat podle více vodítek (například podle levého a horního okraje). Zacházejte s touto interakcí jako s jednou interakcí – sledujte aktivní vodítka a aktivujte ji jenom v případě, že se zobrazí nová příručka.
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
Haptika zlepšuje interakce posuvníku ukotvením zpětné vazby na smysluplné pozice. Vždy propojte zpětnou vazbu s viditelnými značkami, kterým uživatel rozumí — ryskami, pojmenovanými hodnotami nebo mezemi rozsahu.
Kdy spustit: Spusťte haptickou odezvu, když palec přejde přes každou rysku. Vyhněte se průběžné zpětné vazbě mezi jednotlivými tiky, která může působit rušivě.
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;
}
Vylepšení prostředí: Upravujte intenzitu haptické odezvy podle polohy posuvníku, aby uživatelé lépe vnímali, kde se v daném rozsahu nacházejí. Použijte TrySendHapticWaveformForPlayCount, který přijímá explicitní hodnotu intenzity od 0.0 do 1.0.
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;
}
Interakce přetažení a detekce záměru
Během přetažení může objekt překračovat mnoho hranic zarovnání – střed stránky, vodítka, další objekty. Spouštění haptické odezvy při každém překročení hranice může uživatele zahltit, zejména při rychlých pohybech, kdy jen mění polohu místo toho, aby se snažili o přesnost.
Použijte detekci záměru ke spuštění odezvy pouze tehdy, když se uživatel pokouší něco záměrně zarovnat, nikoli když jen prochází kolem.
Přístup 1: Filtr rychlosti
Potlačit haptickou odezvu při rychlém pohybu kurzoru a ponechat ji pro pomalejší, záměrnější pohyb.
- Stabilizujte signál. Nepoužívejte nezpracované rozdíly kurzoru, které můžou být hlučné mezi vstupními typy, nastavením DPI a konfiguracemi zobrazení. Normalizovat a vyhladit signál.
- Pečlivě zvolte prahovou hodnotu. Ověřte v různých zařízeních, typech vstupů, škálách zobrazení a nastaveních s více zobrazeními.
Přístup 2: Zrušení časovače
Když objekt vstoupí do zóny triggeru, spusťte krátký časovač (50 ms je rozumným výchozím bodem). Pokud objekt po vypršení časovače zůstane v zóně, považujte to za záměrné a spusťte haptickou odezvu. Pokud se objekt přesune dříve, než se spustí časovač, potlačte zpětnou vazbu.
- Jednodušší implementace a tendenci vytvářet stabilnější chování než rychlé filtrování.
- Zpoždění 50 ms je dostatečně dlouhé, aby odlišilo záměrné zarovnání od rychlého průchodu, zatímco zůstává pod prahovou hodnotou znatelné latence.
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();
}
Volba mezi těmito dvěma
| Filtr rychlosti | Zrušení časovače | |
|---|---|---|
| Jak to funguje | Reaktivní – měří pohyb v reálném čase | Prediktivní – krátce počká na potvrzení záměru. |
| Pociťte | Může působit pohotověji | Mírně zpožděné, ale konzistentnější |
| Úsilí při ladění | Vyšší – vyžaduje pečlivou kalibraci. | Nižší – hodnota s jedním zpožděním je obvykle dostatečná. |
| Doporučeno pro: | Aplikace vyžadující vysoce rychlou zpětnou vazbu | Většina aplikací; dobrý výchozí výchozí bod |
Související články
Windows developer