2009-06-10 17 views
6

Come si scarica il buffer della tastiera in C# utilizzando Windows Form?C# o .NET Keyboard Buffer di flussaggio

Ho uno scanner di codici a barre che funziona come una tastiera. Se viene scansionato un codice a barre molto lungo e il modulo di annullamento viene premuto sul modulo, è necessario cancellare il buffer della tastiera. Quindi ho bisogno di svuotare e ignorare tutti gli input in sospeso. Ho bisogno del buffer cancellato perché se il codice a barre contiene spazi, gli spazi vengono elaborati come clic del pulsante che non è necessario.

+0

Cosa intendi per buffer della tastiera?Vuoi svuotare e ignorare tutti gli input in sospeso che non hai ancora elaborato? – Michael

+0

Perché stai provando a farlo? – SLaks

+0

Sì ... ad esempio, ho uno scanner di codici a barre che funziona come una tastiera ... se un codice a barre molto lungo viene scansionato e il pulsante Annulla viene premuto sul modulo, ho bisogno che il buffer della tastiera venga cancellato. Quindi ho bisogno di svuotare e ignorare tutti gli input in sospeso. –

risposta

1

io non sono sicuro che si può fare questo. Le sequenze di tasti entrano nella coda degli eventi per il ciclo degli eventi principale. Qualsiasi azione eseguita per annullare queste sequenze di tasti verrà inserita nella coda dopo i tasti.

Il ciclo degli eventi arriverà all'azione Annulla solo dopo che i tasti sono stati elaborati. È possibile annullare le sequenze di tasti solo in base ad alcuni eventi che si verificano nel mezzo della sequenza di tasti.

2

Imposta KeyPreview sul Form per true, poi prendere l'evento KeyPress e impostare e.Handled a true se annullare stato cliccato.

EDIT: Cattura evento KeyPress del form

0

È potrebbe fare livello di BIOS di lavaggio (http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10), ma vorrei consigliare contro questo approccio a basso livello dal momento che Windows fa anche il buffer della tastiera su un livello più alto.

Il modo migliore sembra essere quello di mangiare qualsiasi char in arrivo mentre è impostato uno specifico flag. Come suggerisce SLaks, impostare KeyPreview su true e impostare su true in KeyPress o su KeyDown .. non dovrebbe fare alcuna differenza.

2

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

1

@ Chris:

Console.KeyAvailable ha generato un'eccezione su di me perché la console non ha avuto attenzione.

Tuttavia, il messaggio di eccezione è stato utile. Suggeriva di utilizzare Console.In.Peek() per leggere in quell'istanza.

Ho pensato che valesse la pena notare qui come soluzione alternativa e per i posteri.

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

Disabilitare il modulo e forzare l'esecuzione di tutte le elaborazioni con DoEvents mentre è disabilitato. I controlli dovrebbero rifiutare qualsiasi keystoke perché sono disabilitati. Quindi riattivare il modulo.

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

E 'una questione vecchia, ma ho avuto lo stesso problema e ho trovato un buon modo per farlo ...
Quando Application.DoEvent() viene chiamato, il buffer keystoke chiamare l'evento Pressione, ma _keypress è impostato su false, quindi salterà tutti, dopo che _keypress tornerà a true per essere pronto per un altro evento 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 
Problemi correlati