2009-12-30 13 views
7

Ho un modulo con una singola casella di testo. Nessun altro controllo Ogni volta che digito il tasto "Invio" o il tasto "Esc", il modulo funziona come desidero; ma sento l'orribile errore di Windows. Il codice è simile al seguente ...Come arrestare il suono di errore della finestra quando si digita "Invio" o "Esc"

public class EntryForm: Form 
{ 
    public EntryForm() 
    { 
    } 

    private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
    if(e.KeyCode == Keys.Enter) 
    { 
     // do some stuff 
     Hide(); // I've also used DialogResult = DialogResult.OK here 
     e.Handled = true; 
    } 
    else if(e.KeyCode == Keys.Escape) 
    { 
     Hide(); // I've also used DialogResult = DialogResult.Cancel here 
     e.Handled = true; 
    } 
    } 
} 

posso 'incidere' e rendere la fermata del rumore aggiungendo il seguente codice al costruttore del form.

AcceptButton = new Button(); 
CancelButton = new Button(); 

Come ho dichiarato, il suono non viene riprodotto, ma penso che sia una cattiva forma; soprattutto dal momento che non ho bisogno di un pulsante sul modulo.

Qualcuno sa perché questo è il comportamento e se c'è un modo più pulito per fermare il suono di errore dal gioco?

+0

Se non si dispone di alcun pulsante, in che modo si ottiene la finestra di dialogo quando si preme enter o esc? Normalmente un modulo con jus un controllo di modifica si limiterà a sedersi quando premi enter o esc. –

+0

@John Knoeller - Il metodo Hide() nasconde il modulo. Puoi anche impostare la proprietà visible su false. Se hai visualizzato il modulo in modo modale, tutto ciò che devi fare è impostare il risultato della finestra di dialogo dal codice e il modulo scomparirà. –

risposta

6

C'è una correzione più "corretta", una che funziona indipendentemente dal numero di controlli disponibili e segue il modello di progettazione di Windows Form. Incolla questo codice nel modulo:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == Keys.Escape || keyData == Keys.Enter) { 
    this.Hide(); 
    return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

@nobugz - Funzionava come un campione. Grazie. –

12

Nell'evento KeyDown, impostare e.Handled = true e e.SuppressKeyPress = true.

+0

@Andrew: ciò non ha avuto alcun effetto sul comportamento. Grazie per la risposta, però, poiché non avevo mai visto prima la proprietà SuppressKeyPress. –

+0

Questo ha funzionato per me. – kervin

+0

Ha funzionato anche per me! Grazie :) – Jake

2

Questa è una risposta troppo lunga alla risposta di Nobugz per rientrare in un commento. Se si utilizza il codice Nobugz come è:

  1. il modulo sta per essere nascosto non importa che controllano la forma è attivo ed è attiva l'input da tastiera, e che è indipendente dal fatto che il modulo ha la 'KeyPreview proprietà impostata su 'true' o 'false'.

Ecco cosa dovete fare per rendere solo un controllo specifico (in questo caso un TextBox denominato 'textBox1) essere nascosto nelle ProcessCmdKeys over-ride:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (msg.HWnd == textBox1.Handle) 
    { 
     if (keyData == Keys.Escape || keyData == Keys.Enter) 
     { 
      textBox1.Hide(); 
      return true; 
     } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

Naturalmente se si voleva gestire il caso di più controlli che devono essere nascosti, è possibile implementare un 'istruzione switch o qualsiasi altra cosa per testare il msg.HWnd contro: nota faccio qui l'ipotesi che tutti i controlli che potrebbero avere input da tastiera abbiano un HWnd valido.

Un po 'di memoria (vaga) di una situazione in cui ho usato questa tecnica e un controllo di input del testo in qualche modo aveva ancora il fuoco di input da tastiera ... quando non intendevo farlo ... mi fa venir voglia di aggiungere un ulteriore test in questo modo:

&& this.ActiveControl == textBox1 

Ma, prendere che con un "granello di sale", dal momento che non posso essere certo è necessario.

+0

@BillW - Grazie per le informazioni extra. In questo caso, voglio che l'intero modulo sia nascosto; ma l'informazione è buona per sapere per il futuro. –

Problemi correlati