Очистка буфера клавиатуры C# или .NET
Вопрос
Как очистить буфер клавиатуры на 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