Preciso determinar por quanto tempo uma tecla foi mantida pressionada com alta precisão. Por exemplo, se a tecla for pressionada muito rapidamente, é possível relatar um tempo menor que o tempo para cada quadro de atualização.
Preciso determinar por quanto tempo uma tecla foi mantida pressionada com alta precisão. Por exemplo, se a tecla for pressionada muito rapidamente, é possível relatar um tempo menor que o tempo para cada quadro de atualização.
Respostas:
Você pode capturar a entrada usando a classe System.Windows.Forms.NativeWindow. Você receberá uma notificação quando ocorrer um evento de entrada. Dessa forma, você será notificado o mais rápido possível, exatamente quando ocorrer, permitindo que você registre o tempo com maior precisão. Fica meio bagunçado (código nativo / não seguro), mas funciona.
Eu acho que isso só funciona no Windows, mas acho que essa é a plataforma de sua segmentação (não é necessário para isso no Xbox e no WP7).
Aqui está um bom exemplo (da estrutura nuclex): WindowInputCapturer (nota: esse código pode ter sido atualizado recentemente e eu não o codifiquei)
Editar: Isso também permite que você obtenha o código de caractere da tecla pressionada. Isso pode ser útil para receber entrada de texto (especialmente coisas como caracteres latinos). Não sei por que você precisaria obter entrada com uma precisão tão alta, mas seria uma boa maneira de fazê-lo na minha opinião.
Armazene o estado da chave em uma variável e compare no próximo loop com os estados da chave atual. Crie um DateTime
objeto para manter o início e você poderá comparar DateTime.Now
quando o estado da chave anterior não corresponder.
Exemplo muito simples do que quero dizer:
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; }
Não conheço nenhuma maneira oficial de fazer isso; você pode executar um segundo thread em um loop muito apertado apenas para verificar a entrada e enviá-lo para um buffer circular suficientemente grande para exigir muito pouca sincronização entre os threads.
(Armazene algum tipo de número crescente em cada slot do buffer e atualize que APÓS o thread gravou todos os dados, continue lendo os slots com dados do buffer até o número diminuir (não se esqueça de verificar se há números excedentes!))
Se você atualizar trinta vezes por segundo, um humano não poderá pressionar as teclas mais rapidamente do que você pode experimentar o estado do teclado. Se você atualizar mais lentamente do que um humano pode digitar, poderá precisar de um thread para renderizar gráficos e outro para ler e responder ao teclado / mouse.
Porém, se você atualizar mais lentamente do que um humano pode digitar, também não poderá fornecer feedback visual para cada tecla pressionada. Isso não importa se a idéia é exibir feedback agregado, como tempo médio entre as teclas pressionadas.