2016-03-10 16 views
5

Sto tentando di rilevare la chiave premere in un TextBox. So che il tasto Tab non attiva gli eventi KeyDown, KeyUp o KeyPress. Ho trovato: Rilevamento della chiave di tabulazione in Windows Form di BlackWasp in Internet. Suggeriscono di sovrascrivere ProcessCmdKey, cosa che ho fatto, ma non viene attivato neanche. Esiste un modo affidabile per rilevare la pressione del tasto Tab?Rileva il tasto di tabulazione Premere in TextBox

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 

    bool baseResult = base.ProcessCmdKey(ref msg, keyData); 

    if (keyData == Keys.Tab && textBox_AllUserInput.Focused) 
    { 
     MessageBox.Show("Tab key pressed."); 
     return true; 
    } 
    if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused) 
    { 
     MessageBox.Show("Shift-Tab key pressed."); 
     return true; 
    } 

    return baseResult; 
} 

Secondo il suggerimento di Cody Grey, ho cambiato il codice come segue:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Tab && textBox_AllUserInput.Focused) 
     { 
      MessageBox.Show("Tab key pressed.");  } 
     if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused) 
     { 
      MessageBox.Show("Shift-Tab key pressed.");  } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 

Il problema è che non cattura la pressione del tasto Tab.

+3

Sì, ProcessCmdKey() è molto affidabile. Nessuno può dire come lo abbia armeggiato. –

+0

Il mio codice è: override protetto bool ProcessCmdKey (ref Message msg, Keys keyData) { bool baseResult = base.ProcessCmdKey (ref msg, keyData); if (keyData == Keys.Tab && textBox_AllUserInput.Focused) { MessageBox.Show ("Tasto Tab premuto."); return true; } ritorno baseResult; } Ho provato tutte e 3 le risposte e nessuna funziona. – user2102327

+0

Non chiamare l'implementazione di base se hai intenzione di sovrascriverlo. Sposta 'base.ProcessCmdKey (...)' alla fine della funzione. –

risposta

0

è possibile utilizzare questo codice per la scheda sono presed ...

private void input_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
    { 
     //Check here tab press or not 
     if (e.KeyCode == Keys.Tab) 
     { 
      //our code here 
     } 
     //Check for the Shift Key as well 
     if (Control.ModifierKeys == Keys.Shift && e.KeyCode == Keys.Tab) { 

     } 
    } 
6

Alcune pressioni dei tasti, come il TAB, RITORNO, ESC, e tasti freccia, sono tipicamente ignorata da alcuni controlli perché non sono considerati pressioni dei tasti di input.

È possibile gestire l'evento PreviewKeyDown del proprio controllo per gestire tali tratti chiave e impostarli come chiave di input.

private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if(e.KeyData == Keys.Tab) 
    { 
     MessageBox.Show("Tab"); 
     e.IsInputKey = true; 
    } 
    if (e.KeyData == (Keys.Tab | Keys.Shift)) 
    { 
     MessageBox.Show("Shift + Tab"); 
     e.IsInputKey = true; 
    } 
} 
+0

Questo è un hack. Il posto * effettivo * per gestire quei tratti chiave è nel controllo stesso. Sottoclasse TextBox e sovrascrivi IsInputKey. –

+0

@CodyGray È documentato. Leggi la sezione [remarks] (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown (v = vs.110) .aspx # Anchor_1) nella documentazione. Quando puoi gestire una chiave 'Tab' in questo modo, perché hai bisogno di sottoclasse. –

+0

Certo, è un hack documentato. :-) Non lo rende meno di un hack. Ci sono molte ragioni per preferire la sottoclasse, l'incapsulamento, la separazione delle preoccupazioni e il buon design è il principale tra questi. La riusabilità è un'altra preoccupazione irresistibile. Una sottoclasse di TextBox richiede forse 3-4 righe in più rispetto a questo codice, non è un grosso sforzo. –

Problemi correlati