キーが押されている時間を正確に判断できるようにする必要があります。たとえば、キーが非常に速くタップされた場合、各更新フレームの時間より短い時間を報告する可能性があります。
キーが押されている時間を正確に判断できるようにする必要があります。たとえば、キーが非常に速くタップされた場合、各更新フレームの時間より短い時間を報告する可能性があります。
回答:
System.Windows.Forms.NativeWindowクラスを使用して入力をキャプチャできます。入力イベントが発生すると通知が届きます。これにより、発生時にできるだけ早く通知が届き、時刻をより正確に記録できます。多少厄介(ネイティブ/安全でないコード)になりますが、機能します。
これはWindowsでのみ機能すると思いますが、それがターゲットプラットフォームです(XboxおよびWP7では必要ありません)。
以下は良い例です(nuclexフレームワークから):WindowInputCapturer(注:このコードは最近更新された可能性があり、コーディングしていません)
編集:これにより、キーを押したときの文字コードを取得することもできます。これはテキスト入力(特にラテン文字のようなもの)を受け取るのに役立ちます。なぜこれほど高い精度で入力を取得する必要があるのかはわかりませんが、これは私の意見では良い方法です。
キーの状態を変数に格納し、次のループで現在のキーの状態と比較します。DateTime
開始点を保持するオブジェクトを作成するとDateTime.Now
、以前のキーの状態が一致しない場合と比較できます。
私が意味することの非常に単純な例:
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; }
1秒あたり30回更新すると、キーボードの状態をサンプリングするよりも速く人間がキーを押すことができなくなります。人間が入力するよりもゆっくりと更新する場合は、グラフィックスをレンダリングするための1つのスレッドと、キーボード/マウスを読み取って応答するための別のスレッドが必要になることがあります。
ただし、人間が入力できる速度よりもゆっくりと更新すると、キーを押すたびに視覚的なフィードバックを提供できなくなります。これは、キーを押すまでの平均時間などの集計フィードバックを表示することである場合は問題になりません。