.NET中KeyDown
和KeyPress
事件有什么区别?
KeyPress
发生在 KeyDown
和 KeyUp
之间,不是在 KeyUp
之后,与其他答案所述的相反,当未生成字符时,不会调用 KeyPress
,而且在按住键时会重复调用 KeyDown
,这也与其他答案相反。KeyPress
的按键示例:
KeyPress
的按键示例:
KeyDown
大致对应于 WM_KEYDOWN
,KeyPress
对应于 WM_CHAR
,KeyUp
对应于 WM_KEYUP
。 WM_KEYDOWN
可以少于按键重复次数,但它会发送一个重复计数,我记得 WinForms 使用该计数生成每个重复的 KeyDown。非字符键不会触发 KeyPress 事件;但是,非字符键会触发 KeyDown 和 KeyUp 事件。
https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.control.keypress
KeyPress事件仅在可打印字符时触发,并在KeyDown事件之后触发。根据输入延迟设置,可能会有多个KeyDown和KeyPress事件,但只有一个KeyUp事件。
KeyDown
KeyPress
KeyUp
KeyPress是比KeyDown(和KeyUp)更高级的抽象层。KeyDown和KeyUp与硬件相关:键盘上按键的实际动作。而KeyPress更多地表示“我从键盘接收到了一个字符”。
按下键盘按键并没有松开称为KeyDown,Keypress是完整的按下和释放循环。
换句话说,KeyDown + KeyUp = Keypress
我一直认为keydown是在按下键时立即发生的,keypress则是按下并释放键的动作。
我找到这篇文章,它给出了略微不同的解释:http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
无论按键按下多长时间,KEYUP事件只会在释放按键时捕获一次,因此如果您想捕获这样的按压事件,KEYUP是适合的事件。
dddddd
在第一个d出现在屏幕上之前,keydown事件只发生了一次,keypress事件发生了6次,而keyup事件则是在最后一个d出现后才发生。
ProcessDialogKey
方法,并在keyData
为Keys.Tab
或Keys.Shift | Keys.Tab
时返回false,那么你就可以在(On)Key(Down|Press|Up)中看到Tab键的输入了。 - P DaddyPreviewKeyDown
事件。它现在可以工作了,我不会再去碰它了。 - PsychoData