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

Jos*_*off 177 .net

KeyDownKeyPress事件有.net什么区别?

P D*_*ddy 292

这显然有很多误解!

KeyDown和之间唯一的实际区别KeyPressKeyPress传递按键产生的角色,只有在有按键时才会调用.

换句话说,如果你按下A键盘,你将得到以下一系列事件:

  1. KeyDown:KeyCode = Keys.A,KeyData = Keys.A,Modifiers = Keys.None
  2. KeyPress:KeyChar ='a'
  3. KeyUp:KeyCode = Keys.A

但如果你按Shift+ A,你会得到:

  1. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  2. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  3. KeyPress:KeyChar ='A'
  4. KeyUp:KeyCode = Keys.A
  5. KeyUp:KeyCode = Keys.ShiftKey

如果你按住键一段时间,你会得到类似的东西:

  1. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  2. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  3. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  4. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  5. KeyDown:KeyCode = Keys.ShiftKey,KeyData = Keys.ShiftKey,Shift,Modifiers = Keys.Shift
  6. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  7. KeyPress:KeyChar ='A'
  8. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  9. KeyPress:KeyChar ='A'
  10. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  11. KeyPress:KeyChar ='A'
  12. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  13. KeyPress:KeyChar ='A'
  14. KeyDown:KeyCode = Keys.A,KeyData = Keys.A | Keys.Shift,Modifiers = Keys.Shift
  15. KeyPress:KeyChar ='A'
  16. KeyUp:KeyCode = Keys.A
  17. KeyUp:KeyCode = Keys.ShiftKey

该通知KeyPress发生在之间 KeyDownKeyUp,以后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,KeyPressWM_CHARKeyUpWM_KEYUP. WM_KEYDOWN 可以被称为少于密钥重复次数,但它发送重复计数,IIRC,WinForms用于每次重复生成一个KeyDown.

  • @BarnabasSzabolcs:Chrome运行.NET? (3认同)
  • 很好的解释,thx,但有一点需要注意,Escape不会触发Chrome上的KeyPress(不确定其他人). (2认同)

Jon*_*kes 71

非字符键不会引发KeyPress事件; 但是,非字符键确实引发了KeyDown和KeyUp事件.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx

  • 大多数其他答案在某种程度上是错误的,但这一点最接近现实.KeyPress仅针对字符键引发,它遵循键盘输入延迟/重复的设置.事件的实际顺序是:1)KeyDown 2)用于字符键KeyPress一次或多次(取决于系统设置和密钥持有的时间长度)3)KeyUp (17认同)
  • Filip Navara的评论并不完全正确.如果按下某个键,您将获得KeyDown,KeyPress,KeyDown,KeyPress,KeyDown,KeyPress KeyUp.每次重复都会调用KeyDown. (11认同)

ste*_*ell 8

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

KeyDown
KeyPress
KeyUp


Jef*_*nby 5

KeyPress是比KeyDown(和KeyUp)更高级别的抽象.KeyDown和KeyUp是硬件相关的:键盘上键的实际动作.KeyPress更像是"我从键盘上收到了一个角色".