2013-11-25 30 views
0

我想构建一个简单的C#Windows窗体应用程序来收集用户的击键数据。如何收集使用C#的按键时间信息?

基本上,用户需要输入一个长度为10的单词。我想记录每个按键的保持时间,keydown到keydown时间,keyup和keydown用于相邻按键(所以有10 + 9 + 9 = 28个测量)。

任何人都可以告诉我如何使用文本框事件捕获此信息?

在此先感谢

+0

你做工作? –

+0

如果你必须经常处理这类事情,并且感觉很勇敢,那么可以看看Reactive Extensions(http://msdn.microsoft.com/en-us/data/gg577609.aspx)。这几乎就是它发明的。 –

回答

4

您可以处理你的TextBoxKeyUpKeyDown事件。您可以使用DateTime.Now获取当前时间戳。

存储你的最后KeyUpKeyDown活动时间,并添加这样测量:

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); 
} 
+0

谢谢,我认为它可以工作。我试图忽略不好的输入。你知道如何使用KeyEventArgs.KeyValue吗?是“string ch =((Char)e.KeyCode).ToString()”是否正确? –

+0

我怀疑铸造'(Char)e.KeyCode'将工作。 'KeyCode'返回'Keys'枚举值。你想达到什么目的?要过滤特定的字符,你可以使用'e.KeyCode!= Keys.A'。 –

+0

用户的输入应该是长度为10的固定单词(如“abcdefghij”)。所以我需要检查用户是否按右键。我不想使用if(e.KeyCode!= keys.A && e.KeyCode!= Keys.B && ......)这样的长条件。 –