Подтвердить что ты не робот

Разница между событием KeyDown, событием KeyPress и событием KeyUp в Visual Studio

Может ли кто-нибудь сказать мне разницу между событием KeyDown, событием KeyPress и событием KeyUp? Я проверил сайт msdn, и это не объясняет это много.

Может ли кто-нибудь сказать мне в простом логическом смысле, когда происходит каждое событие? Я чувствую, что все вышеупомянутое событие происходит, когда нажата клавиша. Так в чем же разница между ними.

4b9b3361

Ответ 1

  • KeyDown: происходит, когда человек нажимает клавишу (когда клавиатура сначала обнаруживает палец на клавише, это происходит, когда клавиша нажата).

  • KeyPress: происходит, когда клавиша нажата и затем отпущена.

  • KeyUp: происходит при отпускании клавиши

Вы правы, что все эти события происходят, когда клавиша нажата и затем отпущена, в порядке, описанном выше.

Ответ 2

Документация 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);
}

Ответ 3

Здесь случай, когда вы НЕ хотите использовать KeyUp:

У вас есть окно списка и нажатие клавиши Enter в строке вызывает диалог редактора. Проблема: если пользователь нажимает клавишу "Enter" на кнопке "ОК" редактора, событие KeyUp (e.KeyCode = Enter) будет возвращаться в ваш список, заставляя редактор снова открываться. Этого не происходит, если пользователь нажимает клавишу пробела на кнопке ОК редактора; в этом случае событие 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

* Если действие является тем, что может быть сделано в обычно используемом продукте, например, Microsoft Office, например CTRL + A (для "Выбрать все" ), то я имитирую поведение Microsoft, поскольку это то, что пользователи используется.

Ответ 4

KeyDown, затем KeyPress, тогда KeyUp - это порядок, который я нахожу.

Обычно вы хотите перехватить KeyDown, когда он предназначен для приложения, в котором пользователь удерживает клавишу для многорежимного ввода с модификацией режима ключа управления, например, в операции смены щелчка. KeyPress - для простой логики типа ввода - просто получение штрихов. KeyUp подключается к логике, которая выполняется после чего-то еще процессов KeyPress, например, для изменения содержимого текстового поля редактирования после того, как логика main KeyPress вступила в силу. Честно говоря, я не использую KeyUp так много, но иногда это единственный способ получить сообщение после того, как что-то еще обработало KeyPress, и вам нужно проверить/исправить то, что произошло.

Ответ 5

В дополнение к другим ответам:

При попытке выяснить, к какому из этих событий вы должны подключить свое действие, имейте в виду, что событие KeyDown будет запускаться несколько раз, пока нажата клавиша. Иногда вы хотите такое поведение, иногда нет. Исходя из этого, я предлагаю следующее использование (исходя из моего опыта):

(Порядок, в котором запускаются события)

KeyDown

Происходит: когда клавиша нажата и удерживается нажатой
Использование: Выполните действие немедленно при нажатии кнопки или даже несколько раз, когда удерживаете
Пример: перемещение курсора с помощью клавиш со стрелками

,

Нажатие клавиши

Происходит: нажата символьная клавиша (событие более высокого уровня)
Использование: Все, что связано с печатанием
Пример. Обработка ввода текста

,

KeyUp

Происходит: ключ выпущен
Использование: выполнение критических действий, которые должны выполняться только один раз за нажатие клавиши
Пример: запись данных в файл