C # или .NET Flushing Keyboard Buffer - PullRequest
6 голосов
/ 11 июня 2009

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

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

Ответы [ 7 ]

2 голосов
/ 01 октября 2010

while (Console.KeyAvailable) {Console.ReadKey (true); }

2 голосов
/ 11 июня 2009

Установите KeyPreview в форме на true, затем перехватите событие KeyPress и установите e.Handled на true, если была нажата кнопка отмены.

РЕДАКТИРОВАТЬ : перехватить событие формы KeyPress

1 голос
/ 27 сентября 2011

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

this.Enabled = false;
Application.DoEvents();
this.Enabled = true;
1 голос
/ 03 декабря 2010

@ Крис:

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

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

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

 if (-1 < Console.In.Peek()) {
     Console.In.ReadToEnd();
 }
1 голос
/ 11 июня 2009

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

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

0 голосов
/ 04 июля 2015

Это старый вопрос, но у меня возникла та же проблема, и я нашел хороший способ сделать это ...
Когда вызывается Application.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
0 голосов
/ 11 июня 2009

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

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

...