谁能告诉我KeyDown
事件、KeyPress
事件和KeyUp
事件的区别?我检查了msdn网站,它没有解释太多。
谁能以简单的逻辑意义告诉我每个事件发生的时间?我感觉当按下一个键时,上述所有事件都会发生。那么它们之间的确切区别是什么呢?
MSDN文档相当清楚地说明了这三个事件发生的顺序:
关键事件按以下顺序发生:
- KeyDown
按键- 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操作中,您需要钩子KeyDown
。KeyPress
用于简单的键输入类型逻辑—仅获取按键。KeyUp
被钩入在其他程序处理KeyPress
之后执行的逻辑,就像在其主KeyPress
逻辑生效后修改文本编辑框的内容一样。坦率地说,我不使用KeyUp
那么多,但有时这是在其他人处理KeyPress
之后获得消息的唯一方法,您需要检查/修复发生的事情。