一次跟踪多个键的KeyUp和KeyDown

时间:2013-09-18 18:58:19

标签: c# time event-handling keyboard-events keyevent

我需要监控用户在键入时按住每个键的时间。到目前为止,我已经使用了一个keyBoard事件处理程序,并在e.KeyDown上启动了一个秒表,并将其停止为e.KeyUp。这可以正常工作,直到用户同时按下两个按钮,例如在大写时按住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

我的问题;无论如何有效地跟踪每个密钥的时间而不为每个特定密钥写一个事件?

编辑:我想说的是,如果同时按下,是否可以独立跟踪两个键的时间

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的问题,但我会使用Dictionary<Keys, Stopwatch>来跟踪时间。作为词典的键我将使用每个按下的键的小写字符。

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是输出框,但您也可以在此处使用文本文件。