.NET中的KeyDown和KeyPress事件有什么区别?
当前回答
按下键是按下键而不释放它,按键是一个完整的按下-释放周期。
换句话说,KeyDown + KeyUp = Keypress
其他回答
从MSDN:
关键事件的发生顺序如下: KeyDown 键盘按键 按键弹起
此外,KeyPress给你一个机会来声明动作为“处理”,以防止它做任何事情。
显然,关于这一点有很多误解!
KeyDown和KeyPress之间唯一的实际区别是,KeyPress传递按键产生的字符,只有当有一个时才被调用。
换句话说,如果你按下键盘上的A,你会得到这样的事件序列:
KeyDown: KeyCode =键。A, KeyData =键。A, Modifiers =键。郎 KeyPress: KeyChar = a KeyUp: KeyCode =键。A
但如果你按Shift+A,你会得到:
KeyDown: KeyCode =键。ShiftKey, KeyData =键。ShiftKey, Shift, Modifiers=Keys。Shift键 KeyDown: KeyCode =键。A, KeyData =键。A |键。Shift键,Modifiers =键。Shift键 KeyPress: KeyChar = A KeyUp: KeyCode =键。A KeyUp: KeyCode =键。ShiftKey
如果你按住键一段时间,你会得到这样的东西:
KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift KeyDown: KeyCode=Keys.ShiftKey, KeyData=Keys.ShiftKey, Shift, Modifiers=Keys.Shift KeyDown: KeyCode=Keys.A, KeyData=Keys.A | Keys.Shift, Modifiers=Keys.Shift KeyPress: KeyChar='A' KeyDown: KeyCode=Keys.A, KeyData=Keys.A | Keys.Shift, Modifiers=Keys.Shift KeyPress: KeyChar='A' KeyDown: KeyCode=Keys.A, KeyData=Keys.A | Keys.Shift, Modifiers=Keys.Shift KeyPress: KeyChar='A' KeyDown: KeyCode=Keys.A, KeyData=Keys.A | Keys.Shift, Modifiers=Keys.Shift KeyPress: KeyChar='A' KeyDown: KeyCode=Keys.A, KeyData=Keys.A | Keys.Shift, Modifiers=Keys.Shift KeyPress: KeyChar='A' KeyUp: KeyCode=Keys.A KeyUp: KeyCode=Keys.ShiftKey
注意,KeyPress出现在KeyDown和KeyUp之间,而不是在KeyUp之后,正如许多其他答案所述,当字符没有生成时,KeyPress不会被调用,KeyDown在按下时重复,这也与许多其他答案相反。
不直接调用KeyPress的按键示例:
Shift, Ctrl, Alt F1至F12 箭头键
导致调用KeyPress的按键示例:
A到Z, 0到9,等等。 空格键 Tab (KeyChar='\t', ASCII 9) 输入(KeyChar='\r', ASCII 13) Esc (KeyChar='\x1b', ASCII 27) 退格(KeyChar='\b', ASCII 8)
对于好奇的人来说,KeyDown大致与WM_KEYDOWN相关,KeyPress与WM_CHAR相关,KeyUp与WM_KEYUP相关。WM_KEYDOWN可以被称为少于键重复的数量,但它发送一个重复计数,IIRC, WinForms使用每次重复生成一个KeyDown。
来自博客开发者:
为了理解按下键和按下键的区别,理解“字符”和“键”的区别是有用的。“键”是计算机键盘上的一个物理按钮,而“字符”是通过按下按钮键入的符号。理论上,keydown和keyup事件代表按键被按下或释放,而keypress事件代表正在输入的字符。该理论在所有浏览器中的实现并不相同。
注意:您还可以尝试Key Event Tester(在上述站点上可用)来理解这个概念。
非字符键不会引发KeyPress事件;然而,非字符键会引发KeyDown和KeyUp事件。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.keypress
按下键是按下键而不释放它,按键是一个完整的按下-释放周期。
换句话说,KeyDown + KeyUp = Keypress
推荐文章
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- AppSettings从.config文件中获取值
- 如何检查IEnumerable是否为空或空?
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 如何在iis7应用程序池中设置。net Framework 4.5版本
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何指定最小值,但没有使用范围数据注释属性的最大小数?
- 如何在PowerShell中获得本地主机名?
- 为什么在Java和。net中不能修改字符串?
- 'throw'和'throw new Exception()'的区别
- c# int到字节[]
- 如何跟踪log4net问题
- foreach vs somlist . foreach (){}