KeyPreview не обрабатывает событие KeyUp до того, как управление выполнит - PullRequest
1 голос
/ 23 июля 2010

У меня есть форма 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 ]

2 голосов
/ 23 июля 2010

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

1 голос
/ 23 июля 2010

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

...