reg*_*gie 60 c# events event-handling visual-studio-2008
谁能告诉我KeyDown事件,KeyPress事件和KeyUp事件之间的区别?我检查了msdn网站,并没有解释太多.
当每个事件发生时,有人能用简单的逻辑意义告诉我吗?我觉得按下键时会发生上述所有事件.那么它们之间的确切区别是什么呢.
Cod*_*ray 77
嗯,我不确定你仔细检查了MSDN 文档.它说明了三个事件发生得相当清楚的顺序:
关键事件按以下顺序发生:
- 的KeyDown
- 按键
- 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)
Roy*_* T. 62
KeyDown:当用户按下某个键时发生(当键盘首次在按键上检测到手指时,按下按键时会发生这种情况).
KeyPress:当按下一个键然后释放时发生.
KeyUp:释放密钥时发生
你按照我上面描述的顺序按下然后释放按键时会发生所有这些事件.
这是一个你不想使用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的行为,因为这是用户习惯的.
除了其他答案之外:
当尝试确定应该将操作与这些事件中的哪一个关联时,请注意,按住该键时该KeyDown事件将被多次触发。有时您想要这种行为,有时则不需要。基于此,我建议以下用法(根据我的经验):
(事件触发的顺序)
按键按下
发生:按下按键并按住不放时
用法:按下按钮后立即执行操作,甚至按住按钮多次
示例:用箭头键移动光标
。
按键
发生:按下字符键(高级事件)
用法:任何与键入相关的内容
示例:处理文本框输入
。
按键向上
发生:按键被释放
用法:执行关键操作,每次击键只应发生一次
示例:将数据写入文件