Hola,
Estoy desarrollando una aplicación para repetir las pulsaciones del teclado que fueron grabadas anteriormente. El enfoque de la aplicación son los speedrun, sería algo como un TAS (tool-assisted speedrun or tool-assisted superplay).
La aplicación detecta las teclas presionadas mediante el uso de hooks y manteniendo un registro de estas con toda la información que el hook proporciona (lo que encontramos en la estructura KBDLLHOOKSTRUCT). Las secuencia de teclas son detectadas y grabadas correctamente, así como la simulación para reproducir esta secuencia, sin embargo, el problema que estoy teniendo es relacionado a la precisión.
Si por ejemplo, juego Super Mario Bros de Nintendo y grabo todas las pulsaciones del teclado y luego lo reproduzco, puedo ver pequeñas diferencias, salta un poco antes o un poco después, etc. Y si lo pruebo varias veces puedo obtener resultados ligeramente diferentes.
Para calcular cuanto tiempo debe estar presionada una tecla y cuando debe ser liberada he usado la variable time de la estructura KBDLLHOOKSTRUCT, calculando la diferencia entre el keydown y el keyup, uso esta misma información para la simulación. En vista que los resultados no son exactos he desconfiado de este tiempo y he agregado los Ticks que se tienen en el momento del keydown y del keyup, he notado diferencias de varios mili-segundos comparándolos con el time de la estructura que mencioné antes, sin embargo, la simulación usando estos Ticks sigue siendo inexacta.
En cuanto a como hago para esperar el tiempo que se debe para pulsar o liberar una tecla he usado varios métodos, Thread.Sleep, o un ciclo comparando los Ticks e iterando internamente con Thread.SpinWait o Thread.Sleep cada 1ms, stopwath, etc. Después de cada espera verifico las diferencias de tiempos y por lo general no supera 1 ms.
Todo esto me hace pensar si hay algo que debo considerar para lograr conseguir lo que quiero.
¿Será que el tiempo que recibo de los eventos no es exacto? y por tal razón no logro reproducirlo de forma exacta. Será que debo tener en cuenta la resolución de la CPU para hacer más exacta la espera o simplemente debería cambiar el enfoque.
Cualquier ayuda es bien recibida, gracias de ante mano.