Devo essere in grado di determinare da quanto tempo viene tenuto premuto un tasto con elevata precisione. Ad esempio, se toccano i tasti molto velocemente, potrebbe indicare un tempo inferiore a quello di ciascun frame di aggiornamento.
Devo essere in grado di determinare da quanto tempo viene tenuto premuto un tasto con elevata precisione. Ad esempio, se toccano i tasti molto velocemente, potrebbe indicare un tempo inferiore a quello di ciascun frame di aggiornamento.
Risposte:
È possibile acquisire l'input utilizzando la classe System.Windows.Forms.NativeWindow. Riceverai una notifica quando si verifica un evento di input. In questo modo verrai avvisato il più rapidamente possibile al momento opportuno, consentendoti di registrare l'ora con una precisione maggiore. Diventa un po 'disordinato (codice nativo / non sicuro), ma funziona.
Penso che questo funzioni solo su Windows, ma penso che sia la piattaforma di destinazione (non è necessario su Xbox e WP7).
Ecco un buon esempio (dal framework nuclex): WindowInputCapturer (nota: questo codice potrebbe essere stato aggiornato di recente e non l'ho scritto )
Modifica: questo consente anche di ottenere il codice carattere della pressione del tasto. Questo potrebbe essere utile per prendere input di testo (specialmente cose come i caratteri latini) Non sono sicuro del motivo per cui dovresti ottenere input con una precisione così elevata, ma questo sarebbe un buon modo per farlo secondo me.
Memorizza lo stato chiave in una variabile e confrontalo nel ciclo successivo con gli stati chiave correnti. Crea un DateTime
oggetto per contenere l'inizio e puoi confrontarlo con DateTime.Now
quando lo stato chiave precedente non corrisponde.
Esempio molto semplice di cosa intendo:
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; }
Non sono a conoscenza di alcun modo ufficiale per farlo, potresti eseguire un secondo thread in un ciclo molto stretto solo per controllare l'input e inviarlo a un buffer circolare sufficientemente grande da richiedere una sincronizzazione molto piccola tra i thread.
(Conserva una sorta di numero crescente in ogni slot del buffer e aggiorna che DOPO il thread ha scritto tutti i dati, quindi continua a leggere gli slot con i dati dal buffer fino a quando il numero non diminuisce (non dimenticare di verificare la presenza di numeri straripanti!))
Se aggiorni trenta volte al secondo, un essere umano non sarà in grado di premere i tasti più velocemente di quanto tu possa campionare lo stato della tastiera. Se aggiorni più lentamente di quanto un umano possa digitare, potresti aver bisogno di un thread per il rendering della grafica e un altro thread per leggere e rispondere alla tastiera / mouse.
Tuttavia, se si aggiorna più lentamente di quanto un umano possa digitare, non è possibile fornire un feedback visivo per ogni pressione di un tasto. Questo non importa se l'idea è quella di visualizzare un feedback aggregato, come il tempo medio tra la pressione dei tasti.