elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1]
1  Programación / .NET (C#, VB.NET, ASP) / ¿Puede simularse con exactitud una secuencia de teclas grabadas previamente? en: 4 Julio 2020, 07:01 am
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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines