powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Закрытие MessageBox по Escape закрывает форму
13 сообщений из 13, страница 1 из 1
Закрытие MessageBox по Escape закрывает форму
    #39499675
OldAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Столкнулся с особенностью поведения MessageBox.
В форме организована обработка события KeyUp, которая закрывает форму по нажатию клавиши Esc. Если в форме вызвать MessageBox и нажать Esc для его закрытия, то это нажатие помимо MessageBox-а закроет и саму форму, а нужно закрыть только MessageBox. В прошлой жизни я бы после закрытия MessageBox-а очистил клавиатурный буфер.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
using System;
using System.Windows.Forms;

namespace TestKeyUp
{
    public class Form1 : Form
    {
        private Button button1;

        public Form1()
        {
            // Позиция в центре экрана
            this.StartPosition = FormStartPosition.CenterScreen;
            this.Text = "Форма";

            this.KeyUp += new KeyEventHandler(Form1_KeyUp);
            this.KeyPreview = true;

            // Add a Button.  
            button1 = new Button();
            button1.AutoSize = true;
            button1.Text = " Нажми меня ";
            button1.Location = new System.Drawing.Point(100, 120);
            this.Controls.Add(button1);
            this.button1.Click += new System.EventHandler(this.button1_Click);
        }

        // Закрытие формы по Escape
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }

        // Клик на кнопке
        private void button1_Click(object sender, EventArgs e)
        {
            // Так не работает
            // Отписываемся от события закрытия формы по Escape
            this.KeyUp -= new KeyEventHandler(Form1_KeyUp);

            // Если нажать клавишу Esc, то закроется и MessageBox и форма, а нужно закрыть только MessageBox
            MessageBox.Show("Если нажать клавишу Esc, то закроется и MessageBox и Форма!\nА нужно закрыть только MessageBox.", "MessageBox");

            // Подписываемся на событие закрытия формы по Escape
            this.KeyUp += new KeyEventHandler(Form1_KeyUp);
        }

        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.Run(new Form1());
            }
        }
    }
}



Как это можно разрулить?
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499691
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlex,

Самый простой способ, сделать переменную флажок, перед MsgBox его выставлять, в обработке Escape учитывать его и отключать
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499695
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlex,
Сделай проект в конструкторе без динамики. Убери всё лишнее и приложи тест файлы. Проверим.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499717
OldAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD,
В реальности, обработчик клавиши Esc общий для всех форм и "лежит" в родительской форме. Его бы трогать не хотелось.

Petro123,
Архив с примером приложен. VS2013.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499756
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlexАрхив
Я говорил, что все свойства в конструкторе, а не в файле ччччч.cs.
Событие назначается двойным кликом в окне свойства - события.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499764
OldAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
ОК, поправил.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499795
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlexPetro123,
ОК, поправил.

http://www.sql.ru/forum/actualfile.aspx?id=20698422] Приложенный файл (TestCloseEsc.rar - 84Kb)
Ничего не пойму.
Почему в Form1.cs 50 строк каких то комментарий?
Почему там какая то отписка события?
Почему в конструкторе подписка?
Там доджно быть 3 строки messageBox, key=esc и close.
Проект ближе к ночи если смогу посмотрю.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499842
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На своем нулевом проверил - все Ок.
Код: c#
1.
2.
Form1keyPress
Key = 27 close ();
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499863
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlex,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// Закрытие формы по Escape
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }



этот код говорит о том что закрывается по экейпу именно Form1 , мессадж бокс закрывается потому что ты закрыл его владельца(owner) - Form1
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499915
OldAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pation,

Похоже на то.
Поэтому я перед вызовом мессадж бокс отписался от события KeyUp:

Код: c#
1.
this.KeyUp -= new KeyEventHandler(Form1_KeyUp);



Далее вызываю мессадж бокс и на его фоне нажимаю клавишу Escape. Мессадж бокс закрывается.

Далее я снова подписываюсь на события KeyUp:

Код: c#
1.
this.KeyUp += new KeyEventHandler(Form1_KeyUp);



И форма закрывается. :( (срабатывает событие KeyUp c KeyCode == Keys.Escape)

Если на "подписке" поставить точку останова, а затем продолжить, то все ОК, форма не закроется. Подписываюсь на KeyUp с помощью таймера (0,5 с) - все ОК. Но как-то криво что ли.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39499990
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlex,
Я же тебе написал, что у меня все Ок.
Не надо никаких событий руками. И событие press а неup
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39500004
OldAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Спасибо! Да, действительно KeyPress вместо KeyUp решил проблему. Вопрос закрыт.
...
Рейтинг: 0 / 0
Закрытие MessageBox по Escape закрывает форму
    #39500057
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldAlex,
Ок.
И все что можно, назнчай в конструкторе мышкой, а не в коде. Там 2 доп.файла для этого.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Закрытие MessageBox по Escape закрывает форму
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]