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



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

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

MSDN文档相当清楚地说明了这三个事件发生的顺序:

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

  1. KeyDown
  2. 按键
  3. KeyUp

KeyDown 当用户按下键盘上的一个键时,当他们仍然按住它时,它会升高。

KeyPress 对于字符键(不像KeyDown和KeyUp,它们对于非字符键也会被引发)在按下键时被引发。这是一个比KeyDown或KeyUp"更高级别"的事件,因此,EventArgs中有不同的数据可用。

KeyUp 在用户释放键盘上的一个键后引发。

一般来说,您应该在应用程序中处理KeyUp事件。在用户释放键之后,在中不应该启动操作。而且由于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);
}
  • KeyDown:当人按下一个键时发生(当键盘第一次检测到手指在键上时,当键被按下时发生)。

  • KeyPress:键被按下,然后释放。

  • KeyUp:键被释放时发生

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

当你不想使用KeyUp:

您有一个列表框,按下一行上的Enter键将调用编辑器对话框。问题:如果用户按下编辑器的OK按钮上的Enter键,KeyUp(如keycode =Enter)事件将泄漏回您的列表框,导致编辑器重新打开。如果用户按下编辑器OK按钮上的空格键,则不会发生这种情况;在这种情况下,KeyUp(e.p 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(表示"Select All"),那么我模仿Microsoft的行为,因为这是用户习惯的。

除了其他答案:

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

(事件触发的顺序)

KeyDown

发生:当键被按下并按住
用法:按下按钮立即执行操作,甚至按下多次
示例:用方向键移动光标

.

键盘按键

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

.

按键弹起

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

KeyDown然后KeyPress然后KeyUp是我找到的顺序。

通常,当用户按住一个键进行多模式输入并修改控制键模式的应用程序时,例如在shift-click操作中,您需要钩子KeyDownKeyPress用于简单的键输入类型逻辑—仅获取按键。KeyUp被钩入在其他程序处理KeyPress之后执行的逻辑,就像在其主KeyPress逻辑生效后修改文本编辑框的内容一样。坦率地说,我不使用KeyUp那么多,但有时这是在其他人处理KeyPress之后获得消息的唯一方法,您需要检查/修复发生的事情。

相关内容

  • 没有找到相关文章

最新更新