.NET中的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。

其他回答

从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。

非字符键不会引发KeyPress事件;然而,非字符键会引发KeyDown和KeyUp事件。

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.keypress

KeyPress仅由可打印字符触发,并在KeyDown事件后触发。根据输入延迟设置,可以有多个KeyDown和KeyPress事件,但只有一个KeyUp事件。

KeyDown 键盘按键 按键弹起

KeyPress是一个比KeyDown(和KeyUp)更高层次的抽象。KeyDown和KeyUp是与硬件相关的:按键在键盘上的实际动作。KeyPress更多的是“我从键盘上收到一个字符”。