Разница между событиями KeyDown, KeyPress и KeyUp в Visual Studio - PullRequest
57 голосов
/ 03 мая 2011

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

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

Ответы [ 5 ]

74 голосов
/ 03 мая 2011

В документации MSDN указан порядок, в котором три события происходят достаточно четко:

Ключевые события происходят в следующем порядке:

  1. KeyDown
  2. KeyPress
  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);
}
60 голосов
/ 03 мая 2011
  • KeyDown: происходит, когда человек нажимает клавишу (когда клавиатура впервые обнаруживает палец на клавише, это происходит при нажатии клавиши).

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

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

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

7 голосов
/ 02 марта 2013

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

У вас есть список и нажатие клавиши Enter в строке вызывает диалог редактора.Проблема: если пользователь нажимает клавишу Enter на кнопке OK редактора, событие 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, поскольку к этому привыкли пользователи.

2 голосов
/ 03 мая 2011

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

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

1 голос
/ 18 ноября 2018

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

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

(порядок запуска событий)

KeyDown

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

.

KeyPress

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

.

KeyUp

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

...