我正在捕捉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也是如此。
这怎么可能?我能做些什么呢?
由于
答案 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.Delete
和Keys.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());
}
}