获取Control.KeyDown上的char?

时间:2010-09-30 12:34:56

标签: c# .net controls char keydown

处理Control.OnKeyPress事件时,KeyPressEventArgs包含KeyChar

出于可用性原因,我需要完全相同的KeyChar,但在处理OnKeyDown事件时。

KeyEventArgs不包含任何与char相关的数据。我的意思是,如果按A键,有或没有Shift,则不会影响KeyCodeKeyDataKeyValue。使用其他语言时,我仍然可以获得资本英语价值。

如何在KeyPressEventArgs.KeyChar内发生KeyDown事件?

感谢。

3 个答案:

答案 0 :(得分:9)

转换它。这是将'A'转换为'a'的简单功能。它仅转换来自 [A-Z] 集的大写字母。值32是“A”和“a”之间的差异。当然,您可以将其扩展到您的要求,或在此处要求提供功能。

char getChar( KeyEventArgs e )
{
 int keyValue = e.KeyValue;
 if ( !e.Shift && keyValue >= (int) Keys.A && keyValue <= (int) Keys.Z )
  return (char)(keyValue + 32);
 return (char) keyValue;
}

如果您需要它来使用当前的文化,您应该覆盖ProcessKeyMessage控制方法:

protected override bool ProcessKeyMessage( ref Message m )
{
 if ( ( m.Msg == 0x102 ) || ( m.Msg == 0x106 ) ) // this is special - don't remove
 {
  char c = (char) m.WParam; // here is your char for OnKeyDown event ;)
 }
 return base.ProcessKeyMessage( ref m );
}

希望它有所帮助。

答案 1 :(得分:1)

我认为您所寻找的实际上是KeyCode属性。

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Determine whether the key entered is the F1 key. If it is, display Help.
    if(e.KeyCode == Keys.A)
    {
        // Do something kewl
    }
    else if(e.KeyCode == Keys.B)
    {
        // Do something even kewler
    }
}

如果您只是寻找某些按键,您可以设置一个开关声明或任何您的心愿。

答案 2 :(得分:0)

如果您想要使用KeyDown而不是KeyPress的原因是为了捕获给予KeyDown事件的额外信息,您是否可以在KeyDown事件中捕获该额外信息,然后在获取KeyPress时使用它?更确切地说,这是一个很好的方法,但我不确定任何其他方法在键盘映射中真正起作用,它具有“死键”(即产生单个字符的双键序列)。我不知道为什么微软没有将更多的信息传递给KeyPress事件(或者很多事件,因为这个问题),因为尝试匹配因果事件并不完美,但我不知道真的知道更好的选择。