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

los*_*and 4 .net c#

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

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

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

怎么会这样?我能做些什么呢?

谢谢

Fer*_*yer 9

密钥枚举的MSDN文档:

Keys类包含用于处理键盘输入的常量.Keys枚举的成员由一个键代码和一组修饰符组成,这些修饰符组合成一个整数值.在Win32应用程序编程接口(API)的密钥值具有两个半部,与含有键码(其是相同作为Windows虚拟键码)的高位比特,以及低阶位代表键改性剂如SHIFT,CONTROL和ALT键.

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

MSDN有关KeyPressEventArgsKeyChar属性:

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

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

请改用KeyEventArgsKeyCode属性.由于它是Keys类型,而不是char类型,因此非常适合您的用途.要访问此信息,您必须处理KeyDown事件而不是KeyPress事件.

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

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