C# or.NET буфер клавиатуры для промывки
Как очистить буфер клавиатуры в C# с помощью Windows Forms?
У меня есть сканер штрих-кодов, который работает как клавиатура. Если действительно длинный штрих-код сканируется и кнопка отмены нажата на форме, мне нужно очистить буфер клавиатуры. Поэтому мне нужно смыть и игнорировать все ожидающие ввода. Мне нужно очистить буфер, потому что если штрих-код содержит пробелы, пробелы обрабатываются как щелчки кнопки, которые не нужны.
7 ответов
Я не уверен, что вы можете сделать это. Нажатия клавиш идут в очередь событий для основного цикла событий. Любое действие, которое вы предпримете для отмены этих нажатий клавиш, будет помещено в очередь после нажатия клавиш.
цикл событий попадет в ваше действие отмены только после обработки нажатий клавиш. Вы можете отменить нажатия клавиш только на основе некоторого события, которое происходит в середине последовательности нажатия клавиш.
Set KeyPreview
на true
, затем на KeyPress
событие и установить e.Handled
to 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