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

时间:2009-09-02 13:30:56

标签: .net

KeyDown中的KeyPress.net事件之间有什么区别?

10 个答案:

答案 0 :(得分:280)

显然很多对此有误解!

KeyDownKeyPress之间唯一的实际区别是KeyPress会传递按键产生的字符,只有在存在时才会调用。

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

  1. KeyDown:KeyCode = Keys.A,KeyData = Keys.A,Modifiers = Keys.None
  2. KeyPress:KeyChar ='a'
  3. KeyUp:KeyCode = Keys.A
  4. 但如果按 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
    6. 如果你按住键一段时间,你会得到类似的东西:

      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
      18. 请注意KeyPress之后的KeyDown KeyUpKeyUp 之后发生其他答案已经说明,当没有生成一个角色时,KeyPress不会被调用,并且在按下键时会重复KeyDown,这也与许多其他答案相反。

        的密钥示例直接导致对KeyPress的调用:

        • Shift Ctrl Alt
        • F1 F12
        • 箭头键

        执行的键示例会导致对KeyPress的调用:

        • A Z 0 9
        • 空格键
        • Tab (KeyChar ='\ t',ASCII 9)
        • 输入(KeyChar ='\ r',ASCII 13)
        • Esc (KeyChar ='\ x1b',ASCII 27)
        • Backspace (KeyChar ='\ b',ASCII 8)

        好奇的是,KeyDownWM_KEYDOWNKeyPressWM_CHAR以及KeyUpWM_KEYUP大致相关。 WM_KEYDOWN 可以被调用少于密钥重复次数,但它会发送重复计数,IIRC,WinForms用于每次重复生成一个KeyDown。

答案 1 :(得分:69)

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

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

答案 2 :(得分:8)

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

的KeyDown
按键
KEYUP

答案 3 :(得分:5)

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

答案 4 :(得分:4)

来自MSDN:

  

关键事件按以下顺序发生:

     
      
  1. KeyDown

  2.   
  3. KeyPress

  4.   
  5. KeyUp

  6.   

此外,KeyPress让您有机会将操作声明为“handled”,以防止其执行任何操作。

答案 5 :(得分:2)

我一直认为按下按键后就会发生keydown,按下按键是释放按键的动作。

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

答案 6 :(得分:2)

Keydown正在按键而不释放它,Keypress是一个完整的按下并释放循环。

换句话说,KeyDown + KeyUp = Keypress

答案 7 :(得分:1)

来自Blogging Developer

为了理解keydown和keypress之间的区别,了解“character”“key”之间的区别非常有用。 “key”是计算机键盘上的物理按钮,而“character”是按下按钮键入的符号。理论上,keydown和keyup事件表示按下或释放,而keypress事件表示键入字符。在所有浏览器中,该理论的实现并不相同。

注意:您还可以试用密钥事件测试程序(在上述网站上提供)来理解这个概念。

答案 8 :(得分:1)

按下按键时,KEYUP只会被捕获一次,无论按下按键多长时间,所以如果你想只捕获一次这样的按键,KEYUP就是适合捕获的事件。

答案 9 :(得分:0)

最简单的解释:

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

DDDDDD

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