在Visual Studio中KeyDown事件,KeyPress事件和KeyUp事件之间的区别
任何人都可以告诉我的KeyDown
事件, KeyPress
事件和KeyUp
事件之间的区别? 我检查了msdn网站,并没有解释太多。
任何人都可以用简单的逻辑来告诉我什么时候发生的每一件事情? 我觉得所有上述事件发生在按下某个键时。 那么它们之间的确切区别是什么?
-
KeyDown:当用户按下某个按键时(当键盘首次检测到某个按键上的手指时,按下此按键时发生)。
-
KeyPress:当一个键被按下然后释放时发生。
-
KeyUp:当密钥被释放时发生
你是对的,所有这些事件发生在一个键被按下然后释放时,按照上述的顺序。
嗯,我不确定你仔细检查了MSDN 文档 。 它说明了三个事件发生的顺序:
重要事件按以下顺序发生:
- 的KeyDown
- 按键
- 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
之后得到消息的唯一方法,你需要检查/修正发生的事情。