Pulsante Esc per chiudere il modulo Windows Form in C #


91

Ho provato quanto segue:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}

Ma non funziona.

Poi ho provato questo:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}

E ancora niente funziona.

KeyPreview nelle proprietà del modulo Windows Form è impostato su true ... Cosa sto facendo di sbagliato?


1
Hai provato a impostare un punto di interruzione in questi metodi? Il gestore di eventi si sta anche attivando?
Steve Danner

1
Non denominare il pulsante di annullamento come la proprietà del modulo "CancelButton". Altrimenti sembra che non puoi impostare il pulsante Annulla.
Jonas Middendorf

@SteveDanner, l'evento non viene attivato. probabilmente manca la dichiarazione in InitializeComponent ().
InfantPro'Aravind '12

Penso che il motivo per cui non funziona sia perché altri controlli all'interno del modulo hanno ottenuto il focus ...
itsho

Risposte:


199

Funzionerà sempre, indipendentemente dalla corretta assegnazione del gestore eventi, KeyPreview, CancelButton ecc:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Close();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

10
-1, l'utilizzo della proprietà CancelButton del form è il modo corretto.
ABCD

14
Uffa, chiamano gli anni '80, rivogliono la loro finestra di dialogo.
Hans Passant

1
Puoi anche tornare trueda ProcessCmdKeyper segnalare che la chiave è maneggiata, evitando così il rumore "ding".
Spettrale

8
È possibile utilizzare una proprietà CancelButton del form solo se il form dispone di un Button effettivo (o un oggetto dell'interfaccia IButtonControl).
David

3
Questa opzione è buona. CancelButton richiede un ulteriore pulsante visibile "Annulla" sul modulo. Questo è render ridondante + codice + ecc.
V319

64

Dovresti solo essere in grado di impostare la CancelButtonproprietà del modulo sul pulsante Annulla e quindi non avrai bisogno di alcun codice.


2
L'ho fatto ma non viene attivato quando premo esc, perché?
Mihai Bratulescu

Questo ha funzionato benissimo per me. Molto meglio per le forme piccole.
Knut

15

Supponendo che tu abbia un pulsante "Annulla", l'impostazione della CancelButtonproprietà del form (nel designer o nel codice) dovrebbe occuparsene automaticamente. Basta inserire il codice per chiudere in Clickcaso di pulsante.


9

La risposta accettata è effettivamente corretta e ho utilizzato questo approccio diverse volte. All'improvviso non avrebbe più funzionato, quindi l'ho trovato strano. Principalmente perché il mio punto di interruzione non verrebbe premuto per la ESCchiave, ma colpirebbe per altri tasti.

Dopo il debug ho scoperto che uno dei controlli del mio modulo stava sovrascrivendo il ProcessCmdKeymetodo, con questo codice:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

... e questo stava impedendo al mio modulo di ottenere la ESCchiave (nota il return true). Quindi assicurati che nessun controllo figlio stia assumendo il tuo input.


Dalla parte superiore della mia testa, non sono sicuro se è necessario impostare il modulo KeyPreview su true - msdn.microsoft.com/en-us/library/…
Andez

Mi sembra di riscontrare questo problema con i controlli ListView sul mio winform. Mi chiedo se è il ListView dove hai visto anche il problema?
raddevus

1

Si imposta KeyPreview su true nelle opzioni del modulo e quindi si aggiunge l'evento Keypress. Nel tuo evento di pressione dei tasti digiti quanto segue:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 27)
    {
        Close();
    }
}

key.Char == 27 è il valore di escape nel codice ASCII.


Questa è una buona soluzione al problema. Ho un modulo con controlli ListView su di esso e in quel caso sembrano ingoiare il pulsante Annulla (quando viene premuto Esc). Ho aggiunto questo codice e ho risolto il problema.
raddevus

0

Con il tasto Esc intendi il tasto Esc? A giudicare dal tuo codice, penso che sia quello che vuoi. Puoi anche provare Application.Exit (), ma Close dovrebbe funzionare. Hai un thread di lavoro? Se è in esecuzione un thread non in background, l'applicazione potrebbe rimanere aperta.


0

È necessario aggiungerlo all'evento "KeyUp".

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }

0

Puoi anche attivare qualche altra forma.

Ad esempio, attiva un pulsante Annulla se modifichi la proprietà CancelButton del modulo e imposti il ​​pulsante Annulla.

Nel codice premere il pulsante Annulla come segue per chiudere il modulo:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.