> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Devoluciones de llamada de GameInput

> Devoluciones de llamada de GameInput

<a id="introductionSection" />

Aunque `GameInput` está diseñado principalmente en torno a un modelo de sondeo, existen casos en los que es mejor notificar a las aplicaciones de forma asincrónica. Para admitir esto, la interfaz [IGameInput](/reference/input/gameinput/interfaces/igameinput/igameinput) expone algunos métodos para registrar funciones de devolución de llamada que se invocan cuando se producen determinados eventos de interés.

Internamente, `GameInput` serializa el envío de las devoluciones de llamada de modo que solo se ejecute una devolución de llamada a la vez. `GameInput` garantiza que las devoluciones de llamada se envían en orden cronológico. Estas garantías simplifican el código que una aplicación necesita escribir en sus funciones de devolución de llamada.

`GameInput` permite un máximo de 64 devoluciones de llamada registradas en cualquier momento, independientemente del tipo. Las devoluciones de llamada se envían desde un subproceso de trabajo interno de `GameInput`. Para obtener más información sobre cómo funciona esto, junto con las opciones para programar manualmente este trabajo, consulte [Colas de trabajo de GameInput](/build/core-features/common/input/advanced/input-work-queues).

<a id="deviceCallbacksSection" />

## Devoluciones de llamada de dispositivo

Las devoluciones de llamada de dispositivo proporcionan una manera de que las aplicaciones sepan cuándo cambia el estado de los dispositivos de entrada, como se muestra en la sintaxis siguiente. Lo más habitual es que se usen para detectar cuándo se conectan y desconectan los dispositivos, pero otros cambios de estado también pueden ser de interés.

```c++ theme={null}
HRESULT RegisterDeviceCallback(
    _In_opt_ IGameInputDevice * device,
    _In_ GameInputKind inputKind,
    _In_ GameInputDeviceStatus statusFilter,
    _In_ GameInputEnumerationKind enumerationKind,
    _In_opt_ void * context,
    _In_ GameInputDeviceCallback callbackFunc,
    _Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);
```

Las devoluciones de llamada de dispositivo se pueden registrar con varios filtros opcionales. Esto incluye el filtrado a dispositivos que producen tipos específicos de entrada, el filtrado a cambios de estado específicos, el filtrado a un dispositivo específico o cualquier combinación de esos filtros. Por ejemplo, una aplicación puede configurar una devolución de llamada para que le notifique cuando un dispositivo se ha desconectado del sistema.

Además de los cambios de estado del dispositivo, el método [RegisterDeviceCallback](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_registerdevicecallback) se puede usar para la enumeración de dispositivos. El parámetro `enumerationKind` toma un valor de la enumeración [GameInputEnumerationKind](/reference/input/gameinput/enums/gameinputenumerationkind), que indica si la enumeración debe realizarse como parte del registro de la devolución de llamada y, en tal caso, si la enumeración debe realizarse de forma bloqueante o asincrónica. Combinar la enumeración de dispositivos con los cambios de estado posteriores en una única operación atómica evita las condiciones de carrera que muchas aplicaciones sufren de forma involuntaria en su código de entrada.

<a id="readingCallbacksSection" />

## Devoluciones de llamada de lectura

Mediante las devoluciones de llamada de lectura, las aplicaciones pueden recibir una notificación cada vez que llegan nuevas lecturas a la secuencia de entrada, como se muestra en la sintaxis siguiente. Aunque muchas aplicaciones encontrarán que el sondeo de la entrada es mejor, existen situaciones en las que la entrada controlada por eventos puede ser preferible. Por ejemplo, la interfaz de usuario del menú principal de un juego podría adaptarse mejor a la entrada basada en eventos. Otro ejemplo es una interfaz de usuario de asignación de entrada que debe esperar la entrada después de pedirle al usuario su selección.

```c++ theme={null}
HRESULT RegisterReadingCallback(
    _In_opt_ IGameInputDevice * device,
    _In_ GameInputKind inputKind,
    _In_ float analogThreshold,
    _In_opt_ void * context,
    _In_ GameInputReadingCallback callbackFunc,
    _Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);
```

Al igual que las devoluciones de llamada de dispositivo, las devoluciones de llamada de lectura se pueden registrar con varios filtros opcionales. Esto es especialmente útil para las devoluciones de llamada de lectura, ya que las aplicaciones pueden estar interesadas en un subconjunto específico de lecturas de la secuencia de entrada. El método [RegisterReadingCallback](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_registerreadingcallback) permite filtrar a dispositivos que producen tipos específicos de entrada o filtrar a la entrada de un dispositivo específico.

Las aplicaciones también pueden especificar un filtro para los valores de entrada analógicos (como los sticks de un mando) que requiera una cantidad mínima de movimiento antes de que se active la devolución de llamada. Esto puede reducir drásticamente la frecuencia de las devoluciones de llamada cuando no se requieren cambios de estado analógicos de alta resolución. Un buen ejemplo de esto es la implementación de una interfaz de usuario de asignación de entrada cuando se espera un cambio de entrada después de pedirle al usuario su selección.

<a id="unregisteringSection" />

## Anulación del registro de devoluciones de llamada

Después de registrar correctamente una devolución de llamada, la aplicación debe garantizar que todos los recursos necesarios para ejecutar la devolución de llamada sigan siendo válidos. Esto incluye tanto los recursos consumidos por el código de la devolución de llamada como la propia función de devolución de llamada, por ejemplo, si la función de devolución de llamada está hospedada en un archivo DLL que la aplicación carga y descarga a petición.

Para reclamar de forma segura estos recursos, una aplicación debe primero anular el registro de la devolución de llamada pasando el token que recibió del método `Register*Callback` al método [UnregisterCallback](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_unregistercallback). Si la devolución de llamada se está ejecutando cuando se llama a este método, se bloquea hasta que la devolución de llamada termina de ejecutarse. Como resultado, una devolución de llamada no puede anular su propio registro desde su propia función de devolución de llamada.

Las devoluciones de llamada también se pueden detener llamando al método [StopCallback](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_stopcallback). Esto no anula el registro de la devolución de llamada, pero garantiza que no se vuelva a llamar. Como el registro de la devolución de llamada no se anula, este método es seguro para llamarlo desde la propia función de devolución de llamada. Termina de ejecutar la devolución de llamada actual, pero no la vuelve a llamar. El registro de las devoluciones de llamada debe anularse en algún momento, ya que solo se permiten 64 devoluciones de llamada en cualquier momento.

<a id="seeAlsoSection" />

## Documentación de referencia de la API

* [GameInput (contenido de la API)](/reference/input/gameinput/gameinput_members)

## Consulte también

[Aspectos básicos de GameInput](/build/core-features/common/input/overviews/input-fundamentals)

[Temas avanzados de GameInput](/build/core-features/common/input/advanced/input-advanced-topics)

[Referencia de la API de entrada](/reference/input/gc-reference-input-toc)


## Related topics

- [GameInputEnumerationKind](/es/reference/input/gameinput/enums/gameinputenumerationkind.md)
- [Temas avanzados de GameInput](/es/build/core-features/common/input/advanced/input-advanced-topics.md)
- [Lecturas de GameInput](/es/build/core-features/common/input/overviews/input-readings.md)
- [Temas avanzados de GameInput: force feedback y devoluciones de llamada](/es/build/core-features/common/input/advanced/index.md)
- [GameInput para desarrolladores de hardware](/es/build/core-features/common/input/hardware/input-hardware-topics.md)
