Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se explica cómo agregar comentarios hápticos a la aplicación de Windows mediante la API InputHapticsManager, incluidos ejemplos de código para patrones de interacción comunes.
Para obtener instrucciones de diseño sobre cuándo y por qué usar hápticos, consulte Directrices de diseño de hápticos.
Dispositivos compatibles
Los hápticos se admiten en dispositivos de entrada como ratones, teclados táctiles y lápices. La disponibilidad varía según el modelo y el fabricante. Compruebe siempre si hay soporte técnico en tiempo de ejecución antes de llamar a las API hápticas (consulte Comprobación de soporte técnico a continuación).
Requirements
| Requirement | Detalles |
|---|---|
| Namespace | Windows.Devices.Haptics |
| Sistema operativo mínimo | Windows 11, SDK 10.0.28000.1721 (marzo de 2026) |
| Alinear/ Colisionar / Paso / Crecer formas de onda | SDK 10.0.28000.1839 (abril de 2026) |
| Contrato de API |
UniversalApiContract versión 19.0 |
Para dirigirse a versiones anteriores del sistema operativo, use ApiInformation.IsTypePresent para proteger todas las llamadas (consulte el código siguiente).
Buscar soporte técnico
Compruebe siempre que la API está disponible y que hay un dispositivo háptico presente antes de su uso. La API no está presente en versiones anteriores del sistema operativo y no todos los dispositivos de entrada admiten hápticos.
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();
Activar una forma de onda
Llame a InputHapticsManager.GetForCurrentThread() en el hilo de la interfaz de usuario para obtener una instancia del administrador asociada al foco de entrada del hilo actual. La detección y el enrutamiento de dispositivos se controlan automáticamente; no es necesario enumerar los dispositivos usted mismo.
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);
}
Importante
Llame a GetForCurrentThread() desde el subproceso de la interfaz de usuario (o el subproceso que tiene el foco de entrada). Si se llama desde un hilo en segundo plano, la retroalimentación no se dirigirá al dispositivo correcto.
Detener la reproducción
Llame a TryStopFeedback cuando finalice un arrastre o una interacción para detener cualquier reproducción háptica que esté en curso.
using Windows.Devices.Haptics;
if (supported)
{
InputHapticsManager
.GetForCurrentThread()
.TryStopFeedback();
}
Ejemplos de implementación
Alineación de objetos
Las guías de alineación son comunes en herramientas de diseño, editores de presentaciones y aplicaciones de diagrama. La retroalimentación háptica añade un segundo canal para que los usuarios puedan notar cuándo los objetos encajan en su sitio, lo que reduce la necesidad de ampliar la vista para confirmar visualmente la alineación.
Cuándo disparar: Use la apariencia de la guía de alineación como desencadenador. Cuando tu lógica de ajuste muestre una guía, activa la respuesta háptica. Si no aparece ninguna guía, no dispare. Esto mantiene los eventos hápticos estrechamente acoplados a los comentarios visibles del sistema.
Evitar duplicados: Una forma puede alinearse con varias guías simultáneamente (por ejemplo, borde izquierdo y borde superior). Trata esto como una sola interacción: realiza un seguimiento de las guías activas y solo se activa cuando aparece una nueva guía.
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
La respuesta háptica mejora las interacciones con el control deslizante al vincular la respuesta a posiciones clave. Vincula siempre la retroalimentación a marcadores visibles que el usuario pueda comprender: marcas de escala, valores identificados o límites del rango.
Cuándo activar: Activa la respuesta háptica cada vez que el pulgar cruce cada marca. Evite la retroalimentación continua entre un tic y el siguiente, ya que puede resultar molesta.
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;
}
Refinar la experiencia: Escale la intensidad háptica en función de la posición del control deslizante para ayudar a los usuarios a detectar dónde están dentro del intervalo. Use TrySendHapticWaveformForPlayCount, que acepta un valor de intensidad explícito de 0.0 a 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;
}
Interacciones de arrastre y detección de intención
Durante un arrastre, un objeto puede cruzar muchos límites de alineación: centro de páginas, guías y otros objetos. Activar la respuesta háptica en cada cruce puede abrumar a los usuarios, especialmente durante movimientos rápidos, cuando se están reposicionando en lugar de intentar ser precisos.
Utiliza la detección de intención para activar la retroalimentación solo cuando el usuario esté intentando alinearse de forma deliberada, no simplemente pasando por ahí.
Enfoque 1: Filtro de velocidad
Suprimir la respuesta háptica cuando el cursor se mueva rápidamente, reservando la respuesta para movimientos más lentos y deliberados.
- Estabiliza la señal. Evite usar los deltas brutos del cursor, ya que pueden presentar ruido según el tipo de entrada, los ajustes de DPI y la configuración de pantalla. Normalice y suaviza la señal.
- Elija un umbral cuidadosamente. Valide en diferentes dispositivos, tipos de entrada, escalas de pantalla y configuraciones de varias pantallas.
Enfoque 2: Antirrebote con temporizador
Cuando un objeto entra en una zona de desencadenador, inicie un temporizador corto (50 ms es un punto de partida razonable). Si el objeto permanece en la zona cuando finalice el temporizador, trátalo como una acción intencionada y activa la respuesta háptica. Si el objeto se aleja antes de que se active el temporizador, suprima la retroalimentación.
- Más sencillo de implementar y tiende a producir un comportamiento más estable que el filtrado de velocidad.
- Un retraso de 50 ms es lo suficientemente largo como para distinguir la alineación deliberada de un paso rápido, mientras permanece por debajo del umbral de latencia notable.
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();
}
Elegir entre los dos
| Filtro de velocidad | Antirrebote del temporizador | |
|---|---|---|
| Cómo funciona | Reactivo: mide el movimiento en tiempo real | Predictiva: espera brevemente para confirmar la intención. |
| Sensación | Puede parecer más inmediato | Ligeramente retrasado, pero más coherente |
| Esfuerzo de optimización | Superior: requiere calibración cuidadosa | Inferior: un único valor de retraso suele ser suficiente. |
| Recomendado para | Aplicaciones que requieren una respuesta inmediata | La mayoría de las aplicaciones; buen punto de partida predeterminado |