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

时间:2011-05-03 14:52:38

标签: c# visual-studio-2008 events event-handling

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

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

5 个答案:

答案 0 :(得分:74)

The MSDN documentation说明了三个事件发生的顺序:

  

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

     
      
  1. 的KeyDown
  2.   
  3. 按键响应
  4.   
  5. KEYUP
  6.   
一旦用户按下键盘上的键,

KeyDown就会被引发,而他们仍然按住它。

KeyPress引发字符键(与KeyDown和KeyUp不同,它们也是为非字符键引发的),同时按下键。这是一个比KeyDown或KeyUp更“高级”的事件,因此EventArgs中提供了不同的数据。

用户在键盘上释放键后会引发

KeyUp

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


然而,关于这些事件的所有的注意事项是,它们仅由具有焦点的控件引发。这意味着如果表单上的按钮控件当前具有焦点,则表单的任何关键事件都不会被引发。对于刚接触.NET的程序员来说,这通常会让人感到困惑。处理此问题的最佳方法是覆盖表单的ProcessCmdKey method

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);
}

答案 1 :(得分:58)

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

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

  • KeyUp:当密钥被释放时发生

你是对的,所有这些事件都是按下按键然后按照我上面描述的顺序释放时发生的。

答案 2 :(得分: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

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

答案 3 :(得分:2)

KeyDown然后KeyPress然后KeyUp是我找到的订单。

通常,您希望挂钩KeyDown用于应用程序,其中用户按住用于控制键模式修改的多模式输入的键,就像在shift-click操作中一样。 KeyPress用于简单的键入口类型逻辑 - 只需获取击键。 KeyUp被挂钩以放入在其他进程处理KeyPress之后执行的逻辑,比如在主KeyPress逻辑生效后修改文本编辑框的内容。坦率地说,我并没有那么多地使用KeyUp,但有时候这是在其他人处理了KeyPress之后获取消息的唯一方法,你需要检查/修复发生了什么。

答案 4 :(得分:1)

除了其他答案:

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

(触发事件的顺序)

  

KeyDown

     

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

  

KeyPress

     

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

  

KeyUp

     

出现:密钥已释放
  用法:执行关键操作,每次击键只能发生一次
  示例:将数据写入文件