Вопрос

Как очистить буфер клавиатуры на C# с помощью Windows Forms?

У меня есть сканер штрих-кода, который действует как клавиатура.Если сканируется очень длинный штрих-код и в форме нажимается кнопка отмены, мне нужно очистить буфер клавиатуры.Поэтому мне нужно очистить и игнорировать все ожидающие ввода.Мне нужно очистить буфер, потому что, если штрих-код содержит пробелы, пробелы обрабатываются как нажатия кнопок, что не является необходимым.

Это было полезно?

Решение

Я не уверен, что ты сможешь это сделать.Нажатия клавиш попадают в очередь событий основного цикла событий.Любое действие, которое вы предпримете для отмены этих нажатий клавиш, будет помещено в очередь после нажатий клавиш.

Цикл событий перейдет к вашему действию отмены только после обработки нажатий клавиш.Вы можете отменить нажатия клавиш только в зависимости от какого-либо события, которое происходит в середине последовательности нажатий клавиш.

Другие советы

Набор KeyPreview в форме для true, то поймай KeyPress событие и набор e.Handled к true если была нажата кнопка «Отмена».

РЕДАКТИРОВАТЬ:Поймать Форма Событие нажатия клавиши

в то время как (Console.KeyAvailable) { Console.ReadKey(true);}

@Крис:

Console.KeyAvailable выдал мне исключение, потому что у консоли не было фокуса.

Однако сообщение об исключении было полезным.Было предложено использовать Console.In.Peek() читать в этом случае.

Я подумал, что здесь стоит отметить альтернативное решение и для потомков.

 if (-1 < Console.In.Peek()) {
     Console.In.ReadToEnd();
 }

Отключите форму и заставьте всю обработку выполняться с помощью DoEvents, пока она отключена.Элементы управления должны отклонять любые нажатия клавиш, поскольку они отключены.Затем снова включите форму.

this.Enabled = false;
Application.DoEvents();
this.Enabled = true;

Ты мог сделать прошивку уровня биоса(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10), но я бы посоветовал не использовать этот низкоуровневый подход, поскольку Windows также выполняет буферизацию клавиатуры на более высоком уровне.

Кажется, лучший способ съесть любого прибывающего символа, пока установлен определенный флаг.Как предлагает SLaks, я бы установил KeyPreview установить значение true и установить e.Handled истинно либо в KeyPress или в KeyDown..не должно иметь никакого значения.

Это старый вопрос, но у меня возникла та же проблема, и я нашел хороший способ сделать это...
Когда Приложение.DoEvent() вызывается, буфер нажатия клавиши вызывает событие KeyPress, но для _keypress установлено значение false, поэтому он пропустит все из них, после этого _keypress вернется в значение true, чтобы быть готовым к другому событию нажатия клавиши!

Public _keypress As Boolean
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Form1.KeyPress
    If Not _keypress Then
        _keypress = True
        //instructions
    End If
    Application.DoEvents()
    _keypress = False
End Sub
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top