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

.netKeyDownKeyPress事件有什么区别?

这显然有很多误解!

KeyDownKeyPress唯一的区别在于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调用的键的示例:

  • ShiftCtrlAlt
  • F1F12
  • 方向键

确实导致KeyPress调用的键的示例:

  • AZ09
  • 空格键
  • Tab (KeyChar ='\ t',ASCII 9)
  • input (KeyChar ='\ r',ASCII 13)
  • Esc (KeyChar ='\ x1b',ASCII 27)
  • 退格 (KeyChar ='\ b',ASCII 8)

奇怪的是, KeyDownWM_KEYDOWNKeyPressWM_CHARKeyUpWM_KEYUP大致相关。 WM_KEYDOWN 可以被调用的次数less于键重复次数,但是它会发送一个重复次数,IIRC,WinForms用来每次重复产生一次KeyDown。

KeyPress事件不是由非字符键引发的; 但是,非字符键会引发KeyDown和KeyUp事件。

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

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

的KeyDown
按键
KEYUP

来自MSDN:

重要事件按以下顺序发生:

  1. 的KeyDown

  2. 按键

  3. KEYUP

此外,KeyPress给你一个机会宣布行动“ 处理 ”,以防止它做任何事情。

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

我一直以为只要按下按键就会发生按键,按键是按下按键并释放按键的动作。

我发现这给了一个不同的解释: http : //bytes.com/topic/net/answers/649131-difference-keypress-keydown-event

Keydown按下键不放开,按键是一个完整的新闻发布周期。

换句话说,KeyDown + KeyUp = Keypress

来自博客开发者 :

为了理解keydown和keypress之间的区别,理解“字符”“键”之间的区别是有用的。 “键”是计算机键盘上的物理button,而“字符”是通过按下button键入的符号。 理论上,keydown和keyup事件代表被按下或释放的键,而keypress事件代表被键入的字符 。 理论的实现在所有的浏览器中都不相同。

注意:您也可以尝试按键事件testing器 (在上述网站上提供)来理解这个概念。

最简单的解释:

我按住了'd'键一秒钟,然后释放。

DDDDDD

在第一个d出现在屏幕上之前发生了一次keydown事件,按键事件发生了6次,keyup事件发生在屏幕上最后d之后。