2009-06-10 41 views
6

Làm cách nào để xóa bộ đệm bàn phím trong C# bằng Windows Forms?C# hoặc .NET Flushing Keyboard Buffer

Tôi có máy quét mã vạch hoạt động như bàn phím. Nếu một mã vạch thực sự dài được quét và nút hủy được nhấn vào biểu mẫu, tôi cần bộ đệm bàn phím được xóa. Vì vậy, tôi cần phải tuôn ra và bỏ qua tất cả các đầu vào đang chờ xử lý. Tôi cần bộ đệm bị xóa vì nếu mã vạch chứa khoảng trắng, các khoảng trắng được xử lý dưới dạng nhấp chuột vào nút không cần thiết.

+0

Bạn có ý nghĩa gì với bộ đệm bàn phím?Bạn có muốn xóa và bỏ qua tất cả các đầu vào đang chờ xử lý mà bạn chưa xử lý chưa? – Michael

+0

Tại sao bạn lại cố gắng làm điều đó? – SLaks

+0

Có ... ví dụ tôi có máy quét mã vạch hoạt động như bàn phím ... nếu mã vạch thực sự dài được quét và nút hủy được nhấn vào biểu mẫu, tôi cần bộ đệm bàn phím được xóa. Vì vậy, tôi cần phải tuôn ra và bỏ qua tất cả các đầu vào đang chờ xử lý. –

Trả lời

1

Tôi không chắc chắn bạn có thể làm điều này. Các tổ hợp phím đi vào hàng đợi sự kiện cho vòng lặp sự kiện chính. Bất kỳ hành động nào bạn thực hiện để hủy các lần nhấn phím này sẽ được đặt trong hàng đợi sau khi nhấn phím.

Vòng lặp sự kiện sẽ chỉ nhận được hành động hủy của bạn sau khi thao tác tổ hợp phím đã được xử lý. Bạn chỉ có thể hủy các tổ hợp phím dựa trên một số sự kiện xảy ra ở giữa trình tự tổ hợp phím.

2

Set KeyPreview trên biểu mẫu cho phép true, sau đó bắt sự kiện KeyPress và thiết lập e.Handled để true nếu hủy được nhấp.

EDIT: Bắt sự kiện KeyPress các Mẫu của

0

Bạn có thể thực hiện xả cấp BIOS (http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10) nhưng tôi khuyên bạn nên sử dụng cách tiếp cận mức thấp này vì Windows cũng làm đệm bàn phím ở mức cao hơn.

Cách tốt nhất có vẻ là ăn bất kỳ chữ ký nào đến trong khi cờ cụ thể được đặt. Như SLaks đề nghị tôi sẽ đặt KeyPreview thành true và đặt e.Handled thành true hoặc trong KeyPress hoặc trong KeyDown .. sẽ không tạo sự khác biệt.

2

trong khi (Console.KeyAvailable) {Console.ReadKey (true); }

1

@ Chris:

Console.KeyAvailable ném một ngoại lệ trên tôi vì Console không có trọng tâm.

Thông báo ngoại lệ là hữu ích. Nó đề xuất sử dụng Console.In.Peek() để đọc trong trường hợp đó.

Tôi nghĩ rằng điều đáng lưu ý ở đây là giải pháp thay thế và cho hậu thế.

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

Vô hiệu hóa biểu mẫu và buộc tất cả quá trình xử lý xảy ra với DoEvent khi bị vô hiệu hóa. Các điều khiển nên từ chối bất kỳ keystokes vì ​​chúng bị vô hiệu hóa. Sau đó bật lại biểu mẫu.

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

Đó là một câu hỏi cũ nhưng tôi có cùng một vấn đề và tôi tìm thấy một cách tốt để làm điều đó ...
Khi Application.DoEvent() được gọi, bộ đệm keystoke gọi sự kiện KeyPress nhưng _keypress được đặt thành false, vì vậy nó sẽ bỏ qua tất cả chúng, sau đó _keypress trở lại true để sẵn sàng cho một sự kiện nhấn phím khác!

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