Saya harus dapat menentukan berapa lama kunci telah ditekan dengan akurasi tinggi. Misalnya, jika tombol yang diketuk sangat cepat dapat melaporkan waktu yang kurang dari waktu untuk setiap bingkai pembaruan.
Saya harus dapat menentukan berapa lama kunci telah ditekan dengan akurasi tinggi. Misalnya, jika tombol yang diketuk sangat cepat dapat melaporkan waktu yang kurang dari waktu untuk setiap bingkai pembaruan.
Jawaban:
Anda bisa menangkap input dengan menggunakan kelas System.Windows.Forms.NativeWindow. Anda akan mendapatkan notifikasi ketika suatu peristiwa input terjadi. Dengan begitu Anda akan diberitahu secepat mungkin tepat saat itu terjadi, memungkinkan Anda merekam waktu dengan presisi yang lebih tinggi. Itu menjadi agak berantakan (kode asli / tidak aman), tetapi berfungsi.
Saya pikir ini hanya bekerja di windows, tapi saya pikir itu adalah platform penargetan Anda (tidak perlu untuk ini di Xbox dan WP7).
Berikut ini adalah contoh yang baik (dari nuclex framework): WindowInputCapturer (catatan: kode ini mungkin telah diperbarui baru-baru ini dan saya tidak mengkodekannya)
Sunting: Ini juga memungkinkan Anda untuk mendapatkan kode karakter dari tombol yang ditekan. Ini bisa berguna untuk mengambil input teks (terutama hal-hal seperti karakter latin) Saya tidak yakin mengapa Anda perlu mendapatkan input dengan ketelitian yang tinggi, tetapi ini akan menjadi cara yang baik untuk melakukannya menurut pendapat saya.
Simpan status kunci ke dalam variabel dan bandingkan pada loop berikutnya dengan status kunci saat ini. Buat DateTime
objek untuk menahan awal dan Anda dapat membandingkan dengan DateTime.Now
ketika kondisi kunci sebelumnya tidak cocok.
Contoh yang sangat sederhana tentang apa yang saya maksud:
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; }
Saya tidak mengetahui adanya cara resmi untuk melakukan ini, Anda dapat menjalankan utas kedua dalam loop yang sangat ketat hanya untuk memeriksa input dan mengirimkannya ke buffer bundar yang cukup besar sehingga memerlukan sedikit sinkronisasi antara utas.
(Simpan beberapa jenis angka yang meningkat di setiap slot buffer dan perbarui bahwa SETELAH utas menulis semua data, kemudian lanjutkan membaca slot dengan data dari buffer hingga jumlahnya berkurang (jangan lupa memeriksa jumlah yang melimpah!))
Jika Anda memperbarui tiga puluh kali per detik, manusia tidak akan dapat menekan tombol lebih cepat daripada Anda dapat mencicipi kondisi keyboard. Jika Anda memperbarui lebih lambat dari yang dapat diketik manusia, maka Anda mungkin perlu satu utas untuk merender gambar, dan utas lainnya untuk membaca dan merespons keyboard / mouse.
Tetapi, jika Anda memperbarui lebih lambat dari yang dapat diketik manusia, maka Anda tidak dapat memberikan umpan balik visual untuk setiap penekanan tombol. Ini tidak masalah jika idenya adalah untuk menampilkan umpan balik agregat, seperti waktu rata-rata di antara penekanan tombol.