Visual Studio中的KeyDown事件,KeyPress事件和KeyUp事件之间的区别

reg*_*gie 60 c# events event-handling visual-studio-2008

谁能告诉我KeyDown事件,KeyPress事件和KeyUp事件之间的区别?我检查了msdn网站,并没有解释太多.

当每个事件发生时,有人能用简单的逻辑意义告诉我吗?我觉得按下键时会发生上述所有事件.那么它们之间的确切区别是什么呢.

Cod*_*ray 77

嗯,我不确定你仔细检查了MSDN 文档.它说明了三个事件发生得相当清楚的顺序:

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

  1. 的KeyDown
  2. 按键
  3. KEYUP

KeyDown 一旦用户按下键盘上的键,它就会被抬起,而它们仍然按住它.

KeyPress在按下键时,会出现字符键(与KeyDown和KeyUp不同,它们也是为非字符键引发的).这是一个比KeyDown或KeyUp更"高级"的事件,因此,可以使用不同的数据EventArgs.

KeyUp 用户在键盘上释放键后引发.

通常,您应该KeyUp在应用程序中处理事件.在用户释放密钥之前,不应在UI中启动操作.而且由于它KeyUp是一个较低级别的事件KeyPress,因此您可以随时获得有关按下的键的大量信息,甚至可以处理非字符键.


然而,关于所有这些事件的注意事项是它们仅由具有焦点的控件引发.这意味着,如果你的表单上的按钮控制当前具有焦点,没有为您的关键事件的形式将不断得到提升.对于刚接触.NET的程序员来说,这通常会让人感到困惑.处理此问题的最佳方法是覆盖表单的ProcessCmdKey方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.A))
    {
        MessageBox.Show("You pressed Ctrl+A!");
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你处理`KeyUp`,如果用户按住键,你就不会重复.同样,只有在你释放钥匙时才会发生某些事情是不正确的.这对于单击按钮而非按键是正确的. (2认同)

Roy*_* T. 62

  • KeyDown:当用户按下某个键时发生(当键盘首次在按键上检测到手指时,按下按键时会发生这种情况).

  • KeyPress:当按下一个键然后释放时发生.

  • KeyUp:释放密钥时发生

你按照我上面描述的顺序按下然后释放按键时会发生所有这些事件.

  • `KeyPress`描述错了.按下键时会出现"KeyPress",即使从未发布过.见[Cody Gray的回答](http://stackoverflow.com/a/5871430/1219414). (4认同)
  • 虽然reggie没有问这个问题,但我在下面添加了一个答案,其中考虑了何时使用KeyDown和KeyUp. (2认同)

Jim*_*m C 7

这是一个你不想使用KeyUp的情况:

您有一个列表框,按行上的Enter键会调用编辑器对话框.问题:如果用户按下编辑器的OK按钮上的Enter键,KeyUp(e.KeyCode = Enter)事件将泄漏回列表框,导致编辑器重新打开.如果用户按下编辑器的OK按钮上的空格键,则不会发生这种情况; 在这种情况下,KeyUp(e.KeyCode = Space)事件在编辑器关闭之前由编辑器处理.

这是我使用的选择启发式:

If I'm handling the Enter key and I need to guard against a case like the one above
  then I use KeyDown    
Else if I'm handling key combinations (e.g. CTRL+C)
   then I favor* KeyDown (KeyUp can make these awkward)   
Else if I am allowing press & hold autorepeat
  then I use KeyDown    
Else 
  I use KeyUp
Run Code Online (Sandbox Code Playgroud)

*如果操作是可以在常用产品中执行的操作,例如Microsoft Office,例如CTRL + A(用于"全选"),那么我模仿Microsoft的行为,因为这是用户习惯的.


mar*_*sze 5

除了其他答案之外:

当尝试确定应该将操作与这些事件中的哪一个关联时,请注意,按住该键时该KeyDown事件将被多次触发。有时您想要这种行为,有时则不需要。基于此,我建议以下用法(根据我的经验):

(事件触发的顺序)

按键按下

发生:按下按键并按住不放时
用法:按下按钮后立即执行操作,甚至按住按钮多次
示例:用箭头键移动光标

按键

发生:按下字符键(高级事件)
用法:任何与键入相关的内容
示例:处理文本框输入

按键向上

发生:按键被释放
用法:执行关键操作,每次击键只应发生一次
示例:将数据写入文件