Как очистить буфер клавиатуры от устаревших сообщений - PullRequest
1 голос
/ 27 января 2011

В моем приложении WinForms есть кнопка. Эта кнопка имеет кнопку ускорения (например, Alt + L). Когда кнопка нажата, я обрабатываю событие Click и отключаю интерфейс, чтобы предотвратить дальнейшее нажатие кнопки до завершения обработки. Однако, когда клавиша акселератора нажата с помощью клавиатуры, эти нажатия клавиш ставятся в очередь и обрабатываются, как только пользовательский интерфейс снова включается. Я не хочу этого Мой вопрос, как очистить / очистить буфер клавиатуры?

Если я использую KeyPress или KeyDown, чтобы съесть тех персонажей, я не знаю, когда они были получены. Я хочу подавить только старые / устаревшие сообщения, которые поступили, когда я еще обрабатывал первое событие Click.

1 Ответ

3 голосов
/ 27 января 2011

Да, действительно, ваша теория проблемы согласуется с теорией, предложенной мной и madmik3 в обмене комментариями выше.Объем работы, выполняемой вашим приложением в потоке пользовательского интерфейса, эффективно блокирует его от обработки других событий, включая нажатия клавиш пользователем.Они ставятся в очередь для последующего выполнения всякий раз, когда ваше приложение завершает свою трудоемкую задачу переднего плана.Это опасности современной многозадачной ОС с упреждением.Конечно, без публикации вашего реального кода лучшее, что я или кто-либо еще могу сделать, - это рассуждать о том, в чем заключается проблема, учитывая наш опыт.

Быстрая проверка, подтверждающая, что это действительно так, - это бросить Application.DoEvents в ваш цикл обработки.Это позволит ОС немедленно обрабатывать нажатия клавиш, что приведет к сбою, потому что кнопка была отключена.(События Click, инициируемые с помощью сочетания клавиш или мыши, не генерируются для элемента управления Button, у которого для свойства Enabled установлено значение "Ложь".) Это самое близкое к чему-либо подобное "промывка буферов ".Я сомневаюсь, что вы все равно получаете события KeyDown или KeyPress до тех пор, пока не будет выполнено какое-либо долгосрочное задание.

Если это решит проблему, долгосрочное решение - создать новый поток и выполнитькакую бы обработку вы ни делали там, а не в своем потоке пользовательского интерфейса.Это предотвратит блокировку вашего потока пользовательского интерфейса и, при условии, что элемент управления Button правильно отключен, приведет к тому, что нажатия клавиш будут сброшены, потому что кнопка, которую они «нажимают», находится в состоянии, в котором нельзя нажать.Самый простой способ создать новый поток - использовать компонент BackgroundWorker .Документация содержит довольно хороший пример.

...