Кнопка виходу, щоб закрити форму Windows Forms у C #


91

Я спробував наступне:

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

Але це не працює.

Потім я спробував це:

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

І все ще нічого не працює.

Для KeyPreview у моїх властивостях форми Windows Forms встановлено значення true ... Що я роблю не так?


1
Ви пробували встановити точку зупинки в цих методах? Обробник подій навіть запускає?
Steve Danner

1
Не називайте свою кнопку скасування, як властивість форми "CancelButton". В іншому випадку здається, що ви не можете встановити кнопку CancelButton.
Йонас Міддендорф,

@SteveDanner, подія не запускається. ймовірно, декларація в InitializeComponent () відсутня.
InfantPro'Aravind '12

Я думаю, що причина, через яку це не працює, полягає в тому, що інші елементи керування всередині форми отримали фокус ...
itsho

Відповіді:


199

Це завжди працюватиме, незалежно від належного призначення обробника подій, KeyPreview, CancelButton тощо:

    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, правильним є використання властивості CancelButton форми.
ABCD

14
Тьфу, закликали 1980-ті, вони хочуть повернути своє діалогове вікно.
Ганс Пассант

1
Ви також можете повернутися trueвід ProcessCmdKeyдо сигналу про те, що клавіша оброблена, таким чином запобігаючи шуму "дзвін".
моторошний

8
Ви можете використовувати властивість CancelButton форми, лише якщо у формі є фактична кнопка (або об’єкт інтерфейсу IButtonControl).
Девід

3
Цей варіант непоганий. Для кнопки CancelButton потрібна додаткова видима кнопка "Скасувати" у формі. Це зайвий візуалізація + код + і т.
Д.

64

Ви просто зможете встановити CancelButtonвластивість форми на кнопку Скасувати, і тоді вам не знадобиться будь-який код.


2
Я зробив це, але при натисканні клавіші esc його не запускають, чому?
Міхай Братулеску,

Для мене це чудово працювало. Набагато краще для малих форм.
knut

15

Якщо припустити, що у вас є кнопка "Скасувати", налаштування CancelButtonвластивості форми (або в конструкторі, або в коді) повинно подбати про це автоматично. Просто розмістіть код, щоб закрити його в Clickразі натискання кнопки.


9

Прийнята відповідь справді правильна, і я вже кілька разів використовував такий підхід. Раптом це вже не спрацювало, тому мені це здалося дивним. Здебільшого тому, що мою точку зупинки не буде натиснуто для ESCклавіші, але вона буде натиснута для інших клавіш.

Після налагодження я виявив, що один із елементів керування у моїй формі перевизначає ProcessCmdKeyметод із цим кодом:

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

... і це заважало моїй формі отримати ESCключ (зауважте return true). Тож переконайтеся, що жоден дочірній контроль не бере над вами введення.


Зверху в моїй голові, не впевнений, чи потрібно встановити для KeyPreview значення true - msdn.microsoft.com/en-us/library/…
Andez

Здається, я стикаюся з цією проблемою з елементами керування ListView на моєму winform. Цікаво, чи це ListView, де ви також бачили проблему?
raddevus

1

Ви встановлюєте для параметра KeyPreview значення true у параметрах форми, а потім додаєте до неї подію Keypress. Під час натискання клавіші ви вводите таке:

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

key.Char == 27 - значення екранування в коді ASCII.


Це хороший спосіб вирішити цю проблему. У мене є форма з елементами керування ListView, і в цьому випадку вони, здається, ковтають кнопку CancelButton (при натисканні клавіші Esc). Я додав цей код, і це вирішило проблему.
raddevus

0

Під кнопкою Escape ви маєте на увазі клавішу Escape? Судячи з вашого коду, я думаю, що це те, що ви хочете. Ви також можете спробувати Application.Exit (), але Close повинен працювати. У вас є робоча нитка? Якщо запущений не фоновий потік, це може тримати програму відкритою.


0

Вам потрібно додати це до події "KeyUp".

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

0

Ви також можете запустити іншу форму.

Наприклад, запустити кнопку Скасувати, якщо ви відредагували властивість Form CancelButton і встановили кнопку Скасувати.

У коді ви звертаєтесь до кнопки Скасувати наступним чином, щоб закрити форму:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.