C# or.NET буфер клавиатуры для промывки

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

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

7 ответов


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

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


Set KeyPreview на true, затем на KeyPress событие и установить e.Handled to true если была нажата отмена.

редактировать: ловить формы событие нажатия клавиши


while (консоль.KeyAvailable) { Консоль.ReadKey (true);}


@Chris:

Console.KeyAvailable бросил исключение на меня, потому что консоль не имеет фокуса.

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

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

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

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

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

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

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


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

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