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

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

任何人都可以用简单的逻辑来告诉我什么时候发生的每一件事情? 我觉得所有上述事件发生在按下某个键时。 那么它们之间的确切区别是什么?

  • KeyDown:当用户按下某个按键时(当键盘首次检测到某个按键上的手指时,按下此按键时发生)。

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

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

你是对的,所有这些事件发生在一个键被按下然后释放时,按照上述的顺序。

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

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

  1. 的KeyDown
  2. 按键
  3. KEYUP

当用户按下键盘上的一个键时, KeyDown被提起,而他们仍然按住它。

在按下键的同时,为字符键(不同于KeyDown和KeyUp,它们也针对非字符键引发)提出KeyPress 。 这是比KeyDown或KeyUp更高级别的事件,因此EventArgs不同的数据。

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

通常,您应该在应用程序中处理KeyUp事件。 直到用户释放密钥之后 ,操作才能用户界面中启动。 而且由于KeyUp是一个比KeyPress更低级别的事件,所以你总能获得足够的关于被按下的键的信息,甚至可以处理非字符键。


但是, 所有这些事件要注意的是,它们只是由重点控制所引起的。 这意味着如果表单上的button控件目前拥有焦点,那么您的表单中的任何关键事件都不会得到提升。 对于刚接触.NET的程序员来说,这经常令人困惑。 处理这个问题的最好方法是重写表单的ProcessCmdKey方法 :

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

以下是您不想使用KeyUp的情况:

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

以下是我使用的select启发式:

 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 (eg 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的行为,因为这是用户习惯的行为。

KeyDown然后KeyPress然后KeyUp是我find的顺序。

通常情况下,您想要在KeyDown挂钩的情况下,在用户按住用于按住多键input键的应用程序时,使用控制键模式修改,例如在shift-click操作中。 KeyPress是用于简单的键inputtypes逻辑 – 只是获得按键。 KeyUp挂钩是为了在其他处理KeyPress之后执行的逻辑,比如在主KeyPress逻辑生效之后修改文本编辑框的内容。 坦率地说,我并没有使用KeyUp ,但有时这是在别的东西已经处理KeyPress之后得到消息的唯一方法,你需要检查/修正发生的事情。