C # 'da Windows Forms formunu kapatmak için Escape düğmesi


93

Aşağıdakileri denedim:

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

Ama işe yaramıyor.

Sonra bunu denedim:

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

Ve hala hiçbir şey çalışmıyor.

Windows Forms form özelliklerimdeki KeyPreview true olarak ayarlandı ... Neyi yanlış yapıyorum?


1
Bu yöntemlerde bir kesme noktası ayarlamayı denediniz mi? Olay işleyicisi ateş ediyor mu?
Steve Danner

1
İptal düğmenizi 'CancelButton' form özelliği gibi adlandırmayın. Aksi takdirde CancelButton'ı ayarlayamazsınız.
Jonas Middendorf

@SteveDanner, olay tetiklenmiyor. Muhtemelen InitializeComponent () içindeki bildirim eksik.
InfantPro'Aravind '12

Yanıtlar:


199

Bu her zaman doğru olay işleyicisi atama bakılmaksızın çalışacak, KeyPreview, CancelButtonvb:

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, Form'un CancelButton özelliğini kullanmak doğru yoldur.
ABCD

14
Ah, 1980'ler aradı, iletişim kutularını geri istiyorlar.
Hans Passant

1
Ayrıca dönebilirsiniz truedan ProcessCmdKeydolayısıyla "Ding" gürültü önleme anahtar ele alındığının sinyale.
Ürkütücü

8
Formun bir CancelButton özelliğini yalnızca formun üzerinde gerçek bir Button (veya bir IButtonControl arabirim nesnesi) varsa kullanabilirsiniz.
David

3
Bu seçenek iyidir. CancelButton, formda ek görünür 'İptal' düğmesi gerektirir . Bu yedekli render + kod + vb
V319

64

Sadece Formun CancelButtonözelliğini İptal düğmeniz olarak ayarlayabilmelisiniz ve bu durumda herhangi bir koda ihtiyacınız olmayacaktır.


2
Bunu yaptım ama esc tuşuna bastığımda ateşlenmedi, neden?
Mihai Bratulescu

Bu benim için harika çalıştı. Küçük formlar için çok daha iyi.
2016

15

Bir "İptal" düğmeniz olduğunu varsayarsak, formun CancelButtonözelliğini (tasarımcıda veya kodda) ayarlamak bunun otomatik olarak halledilmesi gerekir. ClickDüğme durumunda kapatmak için kodu yerleştirmeniz yeterlidir.


9

Kabul edilen cevap gerçekten doğrudur ve bu yaklaşımı birkaç kez kullandım. Birdenbire artık işe yaramayacaktı, bu yüzden tuhaf buldum. Çoğunlukla, kesme noktam ESCanahtar için vurulmayacağı için , ancak diğer anahtarlar için vurulacağı için.

Hata ayıklamadan sonra, formumdaki kontrollerden birinin ProcessCmdKeybu kodla yöntemi geçersiz kıldığını öğrendim :

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

... ve bu, formumun ESCanahtarı almasını engelliyordu (dikkat edin return true). Bu nedenle, herhangi bir alt denetimin girdinizi devralmadığından emin olun.


Aklımın ucunda, KeyPreview formunu true olarak ayarlamanız gerekip gerekmediğinden emin değilim - msdn.microsoft.com/en-us/library/…
Andez

Winformumdaki ListView kontrollerinde bu sorunla karşılaşıyorum. Sorunu da gördüğünüz yerin ListView olup olmadığını merak ediyorum?
raddevus

2

Form seçeneklerinizde KeyPreview öğesini true olarak ayarlarsınız ve ardından buna Keypress olayını eklersiniz. Tuşa basma etkinliğinizde aşağıdakileri yazarsınız:

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

key.Char == 27 ASCII kodundaki kaçış değeridir.


Bu, sorun için iyi bir çözümdür. ListView denetimleri olan bir formum var ve bu durumda CancelButton'u yutuyor gibi görünüyorlar (Esc'ye basıldığında). Bu kodu ekledim ve sorunu çözdüm.
raddevus

0

Escape düğmesi ile Escape tuşunu mu kastediyorsunuz? Kodunuza bakılırsa, bence istediğiniz bu. Application.Exit () de deneyebilirsiniz, ancak Close çalışmalıdır. İşçi iş parçacığınız var mı? Arka planda olmayan bir iş parçacığı çalışıyorsa bu, uygulamayı açık tutabilir.


0

Bunu "KeyUp" olayına eklemeniz gerekir.

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

0

Ayrıca başka bir formu da tetikleyebilirsiniz.

Örneğin, Form CancelButton özelliğini düzenlerseniz ve Cancel düğmesini ayarlarsanız, bir Cancel-Button'ı tetikleyin.

Kodda, formu kapatmak için İptal Düğmesine aşağıdaki gibi girersiniz:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.