KeyPreview не обрабатывает событие KeyUp до того, как управление выполнит

У меня есть форма, myForm, для которой KeyPreview имеет значение true.

Идея состоит в том, что я хочу захватить CTRL-Enter и запустить кнопку отправки формы, независимо от того, какое текстовое поле (или другой элемент управления) может иметь фокус.

Итак, я настроил этот метод:

private void myForm_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.Enter)
    {
        btnCommit_Click(sender, new EventArgs()); 
    }
}

Который делает именно то, что говорит. Проблема в том, что нажатие клавиши ввода также запускается в текстовом поле, которое было в фокусе, поэтому текстовое поле теперь имеет разрыв строки прямо в середине слова или там, где был курсор. Согласно документам MSDN:

Если для этого свойства установлено значение true, форма будет получать все события KeyPress, KeyDown и KeyUp. После того, как обработчики событий формы завершили обработку нажатия клавиши, нажатие клавиши затем назначается элементу управления с фокусом.

К сожалению, это НЕ ИСТИНА, я проверил код, что текстовое поле действительно показывает новый разрыв строки ДО того, как код myForm_KeyUp будет запущен.

Я попытался добавить оба

e.Handled = true;

а также

e.SuppressKeyPress = true;

Безрезультатно, так как текстовое поле уже показывает перенос строки.

Есть идеи? Я что-то пропустил?

2 ответа

Решение

Так что это должно было быть ежу понятно. Я напечатал все это только для того, чтобы понять, что должен был обрабатывать KeyDown вместо KeyUp. KeyUp, очевидно, запускает ПОСЛЕ KeyDown TextBox, даже если он срабатывает до KeyUp TextBox.

Вместо этого вы должны переопределить OnProcessCmdKey(). Он запускается рано, гарантируя, что никакой контроль не сможет украсть нажатие клавиши.

Другие вопросы по тегам