Search code examples
c#keystroketime-measurement

How to gather timing information of keystrokes using C#?


I want to build a simple C# Windows Form Application that gathers user's keystrokes data.

Basically, the user needs to type in a word with length 10. I want to record each key's holding time, keydown to keydown time and keyup and keydown for adjacent keystrokes (so there are 10 + 9 + 9 = 28 measurements).

Could anyone tell me how to capture this information using text box events?

Thanks in advance


Solution

  • You can handle KeyUp and KeyDown events on your TextBox. You can get current timestamp using DateTime.Now.

    Store your last KeyUp and KeyDown events time and add measurements like this:

    private DateTime? keyUpTime = null;
    private DateTime? keyDownTime = null;
    
    private List<double> keyDownKeyUpMeasurements = new List<double>();
    private List<double> keyDownKeyDownMeasurements = new List<double>();
    private List<double> keyUpKeyDownMeasurements = new List<double>();
    
    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        DateTime prevKeyDownTime = keyDownTime;
        keyDownTime = DateTime.Now;
    
        if (prevKeyDownTime != null)
        {
            keyDownKeyDownMeasurements
                .Add(keyDownTime.Subtract(prevKeyDownTime).TotalMilliseconds);
        }
    
        if (keyUpTime != null)
        {
            keyUpKeyDownMeasurements
                .Add(keyDownTime.Subtract(keyUpTime).TotalMilliseconds);
        }
    }
    
    private void textBox_KeyUp(object sender, KeyEventArgs e)
    {
        keyUpTime = DateTime.Now;
        keyDownKeyUpMeasurements
            .Add(keyUpTime.Subtract(keyDownTime).TotalMilliseconds);
    }