Кнопка Escape для закрытия формы Windows Forms в C#

Я попробовал следующее:

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... Что я делаю неправильно?

87
задан Peter Mortensen 15 February 2017 в 18:43
поделиться

4 ответа

Это всегда будет работать, независимо от правильного назначения обработчика событий, 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);
    }
195
ответ дан 24 November 2019 в 07:39
поделиться

Реальное использование _ работает в этом пути:

Менеджер памяти Zend не использует системный malloc для каждого необходимого блока. Вместо этого он выделяет большой блок системной памяти (с приращениями 256K, может быть изменен путем установки переменной среды ZEND _ MM _ SEG _ SIZE ) и управляет ею внутри системы. Итак, существует два вида использования памяти:

  1. Сколько памяти обработчик взял из ОС («реальное использование»)
  2. Сколько этой памяти фактически использовалось приложением («внутреннее использование»)

Любой из них может быть возвращен memory _ get _ usage () . Какой из них более полезен для вас, зависит от того, что вы ищете. Если вы ищете возможности оптимизации кода в определенных частях, «внутренний» может оказаться более полезным для вас. Если вы отслеживаете использование памяти в глобальном масштабе, «real» будет более полезным. memory _ limit ограничивает «реальное» число, так что, как только все блоки, разрешенные пределом, взяты из системы и менеджер памяти не может выделить запрошенный блок, там выделение не удается. Обратите внимание, что «внутреннее» использование в этом случае может быть меньше предела, но выделение все равно может завершиться неудачей из-за фрагментации.

Кроме того, если вы используете средство отслеживания внешней памяти, вы можете установить это переменная среды USE _ ZEND _ ALLOC = 0 , которая отключит вышеупомянутый механизм и заставит механизм всегда использовать malloc () . Это имело бы гораздо худшую производительность, но позволяет использовать средства слежения malloc.

См. также статью об этом менеджере памяти , он также имеет некоторые примеры кода.

-121--2075257-

Вам придется использовать класс, но не волнуйтесь, это довольно просто. Сначала мы назначим правила : hover не только для физически зависших ссылок, но и для ссылок с именем класса hovered .

a:hover, a.hovered { color: #ccff00; }

После нажатия кнопки # btn мы переключим класс .hovered на # ссылку .

$("#btn").click(function() {
   $("#link").toggleClass("hovered");
});

Если ссылка уже имеет класс, он будет удален. Если класс отсутствует, он будет добавлен.

-121--919085-

Вы должны иметь возможность установить для свойства формы CancelButton значение кнопки «Отмена», и тогда вам не понадобится код.

60
ответ дан 24 November 2019 в 07:39
поделиться

Предполагая, что у вас есть кнопка «Отмена», установка свойства формы CancelButton (в дизайнере или в коде) должна позаботиться об этом автоматически. Просто поместите код для закрытия в событие Click кнопки.

15
ответ дан 24 November 2019 в 07:39
поделиться

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

0
ответ дан 24 November 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: