9

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

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

KeyEventArgs不包含任何与字符相关的数据。我的意思是,如果按下A键有或没有Shift它不影响KeyCode,KeyDataKeyValue. 使用另一种语言时也是如此,我仍然获得大写的英语值。

如何获得KeyPressEventArgs.KeyChar内部KeyDown事件?

谢谢。

4

3 回答 3

11

转换它。这是将“A”转换为“a”的简单函数。它仅转换[AZ]集中的大写字符。值 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 Control 方法:

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

希望它有帮助。

于 2010-09-30T13:37:07.020 回答
2

我认为您正在寻找的实际上是 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
    }
}

如果您只是在寻找某些键,您可以设置一个开关状态或任何您想要的。

于 2010-09-30T13:36:24.137 回答
0

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

于 2010-09-30T15:01:34.463 回答