处理Control.OnKeyPress
事件时,KeyPressEventArgs
包含KeyChar
。
出于可用性原因,我需要完全相同的KeyChar
,但在处理OnKeyDown
事件时。
KeyEventArgs
不包含任何与char相关的数据。我的意思是,如果按A
键,有或没有Shift
,则不会影响KeyCode
,KeyData
或KeyValue
。使用其他语言时,我仍然可以获得资本英语价值。
如何在KeyPressEventArgs.KeyChar
内发生KeyDown
事件?
感谢。
答案 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事件(或者很多事件,因为这个问题),因为尝试匹配因果事件并不完美,但我不知道真的知道更好的选择。