2011-09-23 14 views
5

Ho provato a utilizzare gli eventi KeyUp e KeyDown per leggere l'input da tastiera ma non appena ho posizionato altri controlli su Winform, i tasti non vengono letti. Come posso assicurarmi che i tasti siano letti?Come si legge l'input della tastiera su un Winform?

+0

Forse cercavi funziona per modulo vuoto e non funziona se c'è un controllo? – Yuan

+0

Sì, come scritto nelle risposte di seguito, funziona per controlli come pulsante, casella di testo, ecc. Ma quando metto un controllo utente smette di funzionare. – Bildsoe

+0

Non dovrebbe funzionare, l'input da tastiera va al controllo con lo stato attivo. Cosa stai cercando di fare? –

risposta

4

È possibile impostare KeyPreview = true sul modulo per rilevare gli eventi della tastiera.

CURA per farvi capire:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.A) 
     e.SuppressKeyPress = true; 
} 

campione Stupido che riceve gli eventi di tastiera e cadere se A è stato premuto.
Se lo stato attivo è in una casella di testo, vedrai che il testo è scritto, ma non A !!

ANCORA NUOVO: Ho preso questo codice da un esempio VB.NET.
Nel tuo usercontrol, utilizza l'evento "Keypress" della casella di testo per generare un "evento di controllo elettronico".
Questo codice sarebbe nel vostro UserControl personalizzato:

'Declare the event 
Event KeyPress(KeyAscii As Integer) 

Private Sub Text1_KeyPress(KeyAscii As Integer) 
    RaiseEvent KeyPress(KeyAscii) 
End Sub 
+0

Questo non ha funzionato, non sto ancora registrando alcun input. – Bildsoe

+0

@Bildsoe: ho provato e funziona. Dovresti catturare gli eventi 'KeyDown' e' KeyUp' sul modulo: li otterrai, assicurati. Se non inserisci il tuo codice per favore, perché dovrebbe esserci qualcosa di sbagliato ... – Marco

+0

ok grazie, ci proverò, devo aver fatto qualcosa di sbagliato. Ho un controllo utente sul mio modulo, questo cambia qualcosa? – Bildsoe

2

Come dice Marco impostare KeyPreview su true nel modulo per catturare gli eventi chiave nell'intero modulo anziché solo un controllo.

Utilizzare l'evento KeyPress ... KeyUp/Giù sono più per il framework che per il codice. KeyDown è buono se si desidera disabilitare una chiave ... solo campi numerici, ecc. In generale KeyPress è quello che si sta cercando.

Se si desidera impedire che le sequenze di tasti vengano propagate ad altri controlli, impostare KeyPressEventArgs.Handled = true.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx

Avete cablato il gestore di eventi?

MyForm.KeyDown += MyHandler; 

Si può anche fare questo nel riquadro Proprietà ... clic sull'icona dell'evento ...

+0

Ho bisogno di entrambi su e giù. Voglio visualizzare i tasti premuti, quindi qualcosa deve accadere sia su keyUp che su keyDown. – Bildsoe

+0

ah capisco ... KeyUp/Down dovrebbe funzionare allo stesso modo. Hai cablato i gestori di eventi? O nel pannello delle proprietà nella sezione eventi o nel codice? MyForm.KeyDown + = MyEventHandler; – iDevForFun

+0

Sì, avevo cablato il gestore eventi. Funziona, ma non se metto un controllo utente sul modulo, allora smette di funzionare. – Bildsoe

0

Se siete alla ricerca per il modulo stesso per leggere l'input da tastiera, avete già la vostra risposta da altri corrispondenti. Sto aggiungendo questo contributo per la possibilità che tu possa voler aggiungere la gestione delle chiavi ad altri controlli o controlli utente sul tuo modulo. Il mio articolo Exploring Secrets of .NET Keystroke Handling pubblicato su DevX.com (ahimè, richiede una registrazione ma è gratuito) offre una discussione completa su come e perché tutti i vari hook ed eventi keyhandling entrano in gioco. Inoltre, l'articolo include un'utilità "Keystroke Sandbox" per il download gratuito che consente di vedere quali controlli ricevono quali eventi di gestione delle chiavi.

Qui è un'illustrazione da questo articolo per stuzzicare l'appetito:

enter image description here

Problemi correlati