Necesito poder determinar cuánto tiempo se ha mantenido presionada una tecla con alta precisión. Por ejemplo, si presionaron la tecla muy rápido, podría informar un tiempo que es menor que el tiempo para cada marco de actualización.
Necesito poder determinar cuánto tiempo se ha mantenido presionada una tecla con alta precisión. Por ejemplo, si presionaron la tecla muy rápido, podría informar un tiempo que es menor que el tiempo para cada marco de actualización.
Respuestas:
Puede capturar la entrada utilizando la clase System.Windows.Forms.NativeWindow. Recibirá una notificación cuando ocurra un evento de entrada. De esa manera, se le notificará lo más rápido posible cuando ocurra, lo que le permitirá registrar el tiempo con mayor precisión. Se pone un poco desordenado (código nativo / inseguro), pero funciona.
Creo que esto solo funciona en Windows, pero creo que esa es la plataforma a la que apunta (no es necesario para esto en Xbox y WP7).
Aquí hay un buen ejemplo (de nuclex framework): WindowInputCapturer (nota: este código podría haberse actualizado recientemente y no lo codifiqué)
Editar: Esto también le permite obtener el código de caracteres de la tecla presionada. Esto podría ser útil para tomar entradas de texto (especialmente cosas como caracteres latinos). No estoy seguro de por qué necesitaría recibir entradas con una precisión tan alta, pero esta sería una buena forma de hacerlo en mi opinión.
Almacene el estado clave en una variable y compárelo en el siguiente ciclo con los estados clave actuales. Cree un DateTime
objeto para mantener el inicio y pueda compararlo DateTime.Now
cuando el estado de la clave anterior no coincida.
Muy simple ejemplo de lo que quiero decir:
if(currentKeyboardState.IsKeyDown(Keys.Space)
&& !previousKeyboardState.IsKeyDown(Key.Space))
{ DateTime startTime = DateTime.Now; }
...
if(!currentKeyboardState.IsKeyDown(Keys.Space)
&& previousKeyboardState.IsKeyDown(Key.Space))
{ TimeSpan elapsedTime = DateTime.Now - startTime; }
No conozco ninguna forma oficial de hacer esto, podría ejecutar un segundo subproceso en un bucle muy ajustado solo para verificar la entrada y enviar esto a un búfer circular lo suficientemente grande como para requerir muy poca sincronización entre subprocesos.
(Almacene algún tipo de número creciente en cada ranura del búfer y actualícela DESPUÉS de que el hilo haya escrito todos los datos, luego continúe leyendo las ranuras con datos del búfer hasta que el número disminuya (¡no olvide verificar si hay números desbordados!))
Si actualiza treinta veces por segundo, un humano no podrá presionar teclas más rápido de lo que puede muestrear el estado del teclado. Si actualiza más lentamente de lo que un humano puede escribir, entonces puede necesitar un hilo para representar gráficos y otro hilo para leer y responder al teclado / mouse.
Pero, si actualiza más lentamente de lo que un humano puede escribir, tampoco puede proporcionar comentarios visuales para cada pulsación de tecla. Esto no importa si la idea es mostrar comentarios agregados, como el tiempo promedio entre pulsaciones de teclas.