В KeyDown ShowDialog заставляет SuppressKeyPress не работать - PullRequest
3 голосов
/ 17 февраля 2012

В моем приложении я добавил сочетания клавиш (обработчик событий) в TextBox. Одним из них является Ctrl + H, который показывает всплывающее окно Find & Replace.

В обработчике событий KeyDown моей формы я проверяю нажатие клавиш Ctrl + H:

case Keys.H:
    ShowFindReplaceDialog(true); // This line makes the SuppressKeyPress not work
    e.SuppressKeyPress = true;
    break;

Теперь, Ctrl + H - это стандартное сочетание клавиш, эквивалентное нажатию клавиши «Backspace», поэтому мне нужно подавить это.

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

Как это можно заставить работать?

N.B. Ради полноты: вы столкнулись с той же проблемой с MessageBox, под ней все ShowDialog.

1 Ответ

4 голосов
/ 17 февраля 2012

Да, это потому, что вы вызываете ShowDialog ().Это блокирующий вызов, поэтому оператор e.SuppressKeyPress не выполняется до тех пор, пока после диалог не будет закрыт.А ShowDialog прокачивает цикл сообщений в стиле DoEvents, поэтому сообщение о нажатии клавиши отправляется в обычном режиме и запускает событие KeyPress.

Самый простой обходной путь - отложить отображение диалогового окна до завершения обработки сообщения.Элегантно сделано с помощью Control.BeginInvoke (), например:

case Keys.H:
    this.BeginInvoke(new Action(() => ShowFindReplaceDialog(true)));
    e.SuppressKeyPress = true;
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...