viksnamax
@viksnamax
Aliens is here!

Как понять по какой причине закрылась форма?

Если форма/приложение (здесь и дальше по тексту идёт речь про созданною мной форму/приложение на C# через WinForms) по какой-то причине закрылась не пользователем, например, пк резко вырубился или антивирусник вырубил приложение, в таком случае, после закрытия приложения, нужно что бы это же приложение создало файл в который написала причину завершения работы.
Была идея, в обработчиках событий FormClosing или в FormClosed создать файл в который через (FormClosingEventArgs)e.CloseReason запишется причина, но это не сработало... Протестить решил через прогу KillProcess (использую эту прогу, т.к. если, например, ручками остановить приложение через диспетчер задач, то в файл запишется, что пользователь сам остановил приложение, поэтому мне нужен был софт, чтобы моё приложение не определило, что это я закрыл его), которая завершает работу программы, но моё приложение даже моргнуть не успевает, не то что бы создать файл и записать туда данные о причине завершения, вообщем, ничего не создаёт и не записывает.
Какие есть варианты реализации данной задачи? Нужно, чтобы это всё делало одно приложение, то есть без доп. приложений, которые анализирую моё приложение.

Код с обработчиком:
spoiler

private void UserForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Console.WriteLine("Closing!!!");
            string path = @"C:\Users\Kulic\Desktop\reasonclose.txt";
            FileInfo fileInf = new FileInfo(path);

            switch (e.CloseReason)
            {
                case CloseReason.None:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The reason for the closure was not determined or cannot be determined.");                                
                            }
                        }
                        break;
                    }

                case CloseReason.WindowsShutDown:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The operating system closes all applications before shutting down.");
                            }
                        }
                        break;
                    }

                case CloseReason.MdiFormClosing:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The parent form of this multi-document interface (MDI) form is closed.");
                            }
                        }
                        break;
                    }

                case CloseReason.UserClosing:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The form is closed programmatically or through user action in the UI (such as clicking the Close button in the window forms, select Close in the system menu of the window or by pressing ALT+F4).");
                            }
                        }
                        break;
                    }

                case CloseReason.TaskManagerClosing:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("Microsoft Windows task Manager closes the application.");
                            }
                        }
                        break;
                    }

                case CloseReason.FormOwnerClosing:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The owner form is closed.");
                            }
                        }
                        break;
                    }

                case CloseReason.ApplicationExitCall:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The Exit() method of the Application class was called.");
                            }
                        }
                        break;
                    }

                default:
                    {
                        if (!File.Exists(path))
                        {
                            using (StreamWriter sw = File.CreateText(path))
                            {
                                sw.WriteLine("The reason for closing was not revealed");
                            }
                        }
                        break;
                    }
            }
        }

  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Напоминает "вот когда убьют - приходите")
По известным сигналам и штатным закрытиям - писать "закрылось через ...", все остальные ситуации - трактовать как "непредвиденное завершение".
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Попробуйте эту технику. По идее можно еще больше наворотить, но это будет сложнее
Как получить код завершения программы?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы