0

入力時にユーザーが各キーを押している時間を監視する必要があります。これまでのところ、keyBoard イベント ハンドラーを使用して、ストップウォッチを e.KeyDown で開始し、e.KeyUp で停止しました。これは、ユーザーが一度に 2 つのボタンを押したままにするまでは正常に機能します。たとえば、大文字にするときに Shift キーを押したままにします。私のコード:

 public partial class LoginPage : Form
    {
        public LoginPage()
        {
            InitializeComponent();
        }

        Stopwatch KeyStopWatch = new Stopwatch();
        Stopwatch KeyStopWatch2 = new Stopwatch();

        private void textBoxUsername_KeyDown(object sender, KeyEventArgs e)
        {
            KeyStopWatch.Start();

        }


        private void textBoxUsername_KeyUp(object sender, KeyEventArgs e)
        {

            KeyStopWatch.Stop();


            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Desktop\KeyTimes.txt", true))
            {

                file.Write(e.KeyCode + " ");
                file.WriteLine(KeyStopWatch.ElapsedMilliseconds);

            }

            KeyStopWatch.Reset();
            KeyStopWatch2.Reset();
        }
    }

これは私が得た出力例です。一方はキャップなしで、もう一方はキャップ付きです。ちなみに両方にエラーがあります

T 153
H 0
I 89
S 89
Space 111
I 73
S 105
Space 126
A 121
Space 132
T 253
S 0
E 0
T 116

Space 95

T 248
ShiftKey 0
H 89
I 95
S 89
Space 111
I 116
S 100
Space 126
A 111
Space 122
T 407
ShiftKey 0
E 185
S 132
T 84

私の質問; 特定のキーごとにイベントを書き込まずに、各キーのタイミングを効率的に追跡する方法はありますか?

編集:私が言おうとしているのは、同時に押された場合に2つのキーのタイミングを個別に追跡することはできないということです

4

1 に答える 1

1

あなたの質問を理解しているかどうかわかりませんがDictionary<Keys, Stopwatch>、時間を追跡するために a を使用します。Dictionary のキーとして、押された各キーの小文字を使用します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private readonly Dictionary<Keys, Stopwatch> _stopwatches = new Dictionary<Keys, Stopwatch>();

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        _stopwatches[e.KeyCode] = Stopwatch.StartNew();
    }

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        textBox2.Text += e.KeyCode;

        Stopwatch stopwatch;
        if (_stopwatches.TryGetValue(e.KeyCode, out stopwatch))
        {
            stopwatch.Stop();
            textBox2.Text += " " + stopwatch.ElapsedMilliseconds + "ms";
        }

        textBox2.Text += Environment.NewLine;
    }
}

textBox1 は入力ボックスです。textBox2 は出力ボックスですが、ここでもテキスト ファイルを使用できます。

于 2013-09-18T19:06:20.323 に答える