为什么KeyChar for Delete返回与Period相同?

时间:2009-10-01 15:46:57

标签: c# .net

我正在捕捉KeyPress-Event以检查某些允许的值。为了能够删除我在实际检查之前使用以下代码

if (e.KeyChar == (char)Keys.Delete || e.KeyChar == (char)Keys.Back)
{
   return;
}
...actual check for only digits or whatever

问题在于,当我按下键盘上的句号时,e.KeyChar ==(char)Keys.Delete也是如此。

这怎么可能?我能做些什么呢?

由于

5 个答案:

答案 0 :(得分:9)

来自MSDN documentation on the Keys enumeration

  

Keys类包含用于处理键盘输入的常量。 Keys枚举的成员由一个键代码和一组修饰符组成,这些修饰符组合成一个整数值。在Win32应用程序编程接口(API)中,键值有两半,高位包含键代码(与Windows虚拟键代码相同),低位代表键修饰符,如SHIFT,CONTROL和ALT键。

将这些常量转换为 char 是没有意义的,因为您将丢失有价值的信息,而常量值与ASCII字符代码不对应。

来自MSDN concerning the KeyChar property of KeyPressEventArgs

  

您无法获取或设置以下键(...)INSERT和DELETE(...)

KeyChar 返回与按下的键对应的 char 值(ASCII字符代码),而不是其(原始)键代码。因此,您无法检测各种特殊键,也无法将该值与枚举常量进行比较。

使用 KeyEventArgs KeyCode 属性。由于它的类型为,而不是 char ,因此非常适合您的用途。要访问此信息,您必须处理 KeyDown 事件,而不是 KeyPress 事件。

顺便说一句,根据MSDN page on the Control KeyPress event,根本不会为非字符键引发此事件:

  

KeyPress事件不是由非字符键引发的;但是,非字符键确实会引发KeyDown和KeyUp事件。

答案 1 :(得分:3)

也许你应该与e.KeyCode进行比较。它更精确,您无需将Keys.DeleteKeys.Back转换为char

答案 2 :(得分:0)

也许它可以在您的应用程序中使用而不是捕获KeyDown事件。

然后您可以执行以下操作:

if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back)
{
   return;
}

请注意,KeyCode是为KeyDown和KeyUp传递的args的一部分,但不是KeyPress的传递。

答案 3 :(得分:0)

KeyPress适用于字符,KeyDown适用于键。正如Meta-Knight和itsmatt所建议的那样,如果你想检测密钥,你应该使用KeyDown。

如果您查看算术键盘,您会注意到Del.位于相同的键上。

答案 4 :(得分:0)

//If you can change the event handler for the control 
//that you are looking at catching the keys.  
//In the example below textBox1 is using 
//setting the KeyEventHandler to be KeyDownEvents Method...  
//this has the KeyCode properties...

this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownEvents);
//This is the code in the event...
 private void KeyDownEvents(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.BrowserBack)
            {
                MessageBox.Show(e.KeyCode.ToString());
            }
        }