我正在捕捉一个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也是如此.
怎么会这样?我能做些什么呢?
谢谢
Keys类包含用于处理键盘输入的常量.Keys枚举的成员由一个键代码和一组修饰符组成,这些修饰符组合成一个整数值.在Win32应用程序编程接口(API)的密钥值具有两个半部,与含有键码(其是相同作为Windows虚拟键码)的高位比特,以及低阶位代表键改性剂如SHIFT,CONTROL和ALT键.
将这些常量转换为char是没有意义的,因为您将丢失有价值的信息,并且常量值与ASCII字符代码不对应.
从MSDN有关KeyPressEventArgs的KeyChar属性:
您无法获取或设置以下键(...)INSERT和DELETE(...)
KeyChar返回与按下的键对应的char值(ASCII字符代码),而不是其(原始)键代码.因此,您无法检测各种特殊键,也无法将值与Keys枚举常量进行比较.
请改用KeyEventArgs的KeyCode属性.由于它是Keys类型,而不是char类型,因此非常适合您的用途.要访问此信息,您必须处理KeyDown事件而不是KeyPress事件.
顺便说一句,根据Control KeyPress事件的MSDN页面 ,根本不会为非字符键引发此事件:
非字符键不会引发KeyPress事件; 但是,非字符键确实引发了KeyDown和KeyUp事件.