为了账号安全,请及时绑定邮箱和手机立即绑定

.NET中的KeyDown和KeyPress有什么区别?

.NET中的KeyDown和KeyPress有什么区别?

慕田峪4524236 2019-10-05 14:51:15
中的KeyDown和KeyPress事件有.net什么区别?
查看完整描述

4 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

显然对此有很多误解!


KeyDown和之间的唯一实际区别KeyPress是KeyPress中继按键产生的字符,并且只有在有按键时才调用。


换句话说,如果您按下A键盘,则会得到以下事件序列:


KeyDown:KeyCode = Keys.A,KeyData = Keys.A,修饰符= Keys.None

KeyPress:KeyChar ='a'

KeyUp:KeyCode = Keys.A

但是,如果按Shift+ A,您将得到:


KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= Keys.Shift

KeyPress:KeyChar ='A'

KeyUp:KeyCode = Keys.A

KeyUp:KeyCode = Keys.ShiftKey

如果按住键一会,您将得到类似以下内容的信息:


KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,修饰符= Keys.Shift

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= Keys.Shift

KeyPress:KeyChar ='A'

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= Keys.Shift

KeyPress:KeyChar ='A'

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= Keys.Shift

KeyPress:KeyChar ='A'

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= Keys.Shift

KeyPress:KeyChar ='A'

KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,修饰符= 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等等。

Spacebar

Tab (KeyChar ='\ t',ASCII 9)

Enter (KeyChar ='\ r',ASCII 13)

Esc (KeyChar ='\ x1b',ASCII 27)

Backspace (KeyChar ='\ b',ASCII 8)

对于好奇,KeyDown大致关联到WM_KEYDOWN,KeyPress到WM_CHAR和KeyUp到WM_KEYUP。 WM_KEYDOWN 可以调用的次数少于键重复的次数,但是它会发送一个重复计数,IIRC,WinForms会使用该计数来精确地生成每个重复的KeyDown。


查看完整回答
反对 回复 2019-10-05
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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


KeyDown 

KeyPress 

KeyUp


查看完整回答
反对 回复 2019-10-05
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

KeyPress比KeyDown(和KeyUp)具有更高的抽象级别。KeyDown和KeyUp与硬件相关:键盘上按键的实际操作。KeyPress更是“我从键盘上收到了一个字符”。


查看完整回答
反对 回复 2019-10-05
  • 4 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信