В документации MSDN указан порядок, в котором три события происходят достаточно четко:
Ключевые события происходят в следующем порядке:
- KeyDown
- KeyPress
- 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);
}