小编典典

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

all

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


阅读 78

收藏
2022-07-01

共1个答案

小编典典

显然对这个 有很多 误解!

KeyDown和之间唯一实际的区别KeyPress是它KeyPress传递由按键产生的字符,并且仅在有一个字符时才被调用。

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

  1. KeyDown:KeyCode=Keys.A,KeyData=Keys.A,修饰符=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,修饰符=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,修饰符=Keys.Shift
  7. KeyPress:KeyChar=’A’
  8. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  9. KeyPress:KeyChar=’A’
  10. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  11. KeyPress:KeyChar=’A’
  12. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  13. KeyPress:KeyChar=’A’
  14. KeyDown:KeyCode=Keys.A,KeyData=Keys.A | Keys.Shift,修饰符=Keys.Shift
  15. KeyPress:KeyChar=’A’
  16. KeyUp:KeyCode=Keys.A
  17. KeyUp:KeyCode=Keys.ShiftKey

请注意,正如许多其他答案所说,KeyPress发生 在 and 之间 KeyDownKeyUp不是
之后,当没有生成字符时不会调用它,并且在按住键时会重复,这也与许多其他答案相反.KeyUp``KeyPress``KeyDown

直接导致调用的键示例KeyPress

  • Shift, Ctrl, Alt
  • F1 through 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、和相关。 可以 调用少于键重复的次数,但它发送一个重复计数,IIRC,WinForms
使用该计数每次重复生成一个 KeyDown。KeyPress``WM_CHAR``KeyUp``WM_KEYUP``WM_KEYDOWN __

2022-07-01