获取Control.KeyDown上的char?

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

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

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

如何在KeyDown事件中获取KeyPressEventArgs.KeyChar

谢谢。

转换它。 这是将’A’转换为’a’的简单function。 它仅转换来自[AZ]集的大写字母 。 值32是“A”和“a”之间的差值。当然,您可以将其扩展到您的要求,或在此处询问function。

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

希望它有所帮助。

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

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

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