Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
4 / 4 / 0
Регистрация: 10.11.2014
Сообщений: 27
.NET 2.x

Перехват закрытия приложения

28.12.2015, 22:17. Показов 3641. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет

Взял из stackoverflow решение о перехвате закрытия приложения. Ниже код:

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
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
namespace test_exitsign
{
    class Program
    {
 
        internal delegate void SignalHandler(ConsoleSignal consoleSignal);
 
        internal enum ConsoleSignal
        {
            CtrlC = 0,
            CtrlBreak = 1,
            Close = 2,
            LogOff = 5,
            Shutdown = 6
        }
 
        internal static class ConsoleHelper
        {
            [DllImport("Kernel32", EntryPoint = "SetConsoleCtrlHandler")]
            public static extern bool SetSignalHandler(SignalHandler handler, bool add);
        }
 
        private static SignalHandler signalHandler;
 
        static void Main(string[] args)
        {
            signalHandler += HandleConsoleSignal;
            ConsoleHelper.SetSignalHandler(signalHandler, true);
            Log("===");
            Log("Начало лога");
            Console.ReadKey();
        }
 
        private static void HandleConsoleSignal(ConsoleSignal consoleSignal)
        {
            Log("Завершение работы приложения с причиной " + consoleSignal.ToString());
        }
 
        static void Log(string log)
        {
            System.IO.File.AppendAllText(System.IO.Directory.GetCurrentDirectory() + "\\LOG.log", "[" + System.DateTime.Now.ToLongTimeString() + "." + ((System.DateTime.Now.Millisecond < 100) ? ("0" + System.DateTime.Now.Millisecond.ToString()) : System.DateTime.Now.Millisecond.ToString()) + "] " + log + "\r\n");
            return;
        }
    }
}
Проблема в том, что в лог не записывается закрытие приложения при окончании функции Main, а также при завершении процесса диспетчером задач
Может быть, кто-то знает, как сделать логирование абсолютно всех случаев закрытия приложения?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2015, 22:17
Ответы с готовыми решениями:

Запрет пользователю закрытия приложения
Как запретить пользовалю завершать приложение. У меня админские права, а у пользователей их нет. Как поставить в автозагрузку приложение, и...

После закрытия приложения процесс не завершается
Сделал приложение для работы с HID устройствами. Всё что мне необходимо она выполняет, НО когда нажимаю &quot;Подключиться&quot; событие...

Не завершается процесс Excel после закрытия приложения
Часто встречался с подобным вопросом, и сам попадал на эти грабли. После завершения приложения Excel, после обработки, процесс всеравно...

4
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.12.2015, 23:00
Ну если его из диспетчера киланули он ничего не получит. Нештатное завершение без всяких сигналов. Его тупо выкинули из списка активных потоков и выгрузили из памяти. А по функции мэйн - добавь в конце мэйн вызов записи в лог.
0
4 / 4 / 0
Регистрация: 10.11.2014
Сообщений: 27
29.12.2015, 19:19  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну если его из диспетчера киланули он ничего не получит. Нештатное завершение без всяких сигналов. Его тупо выкинули из списка активных потоков и выгрузили из памяти. А по функции мэйн - добавь в конце мэйн вызов записи в лог.
Спасибо, конечно, за ответ, но я уверен, что можно отлавливать и такое, обращаясь к каким-нибудь сторонним библиотекам
Про main знаю, но в моём реальном проекте может быть и такое, что приложение будет завершаться как диспетчером задач, так и taskkill'ом командной строки и руками пользователя, таким образом до конца main'a дело просто не дойдёт
Было бы WinForms - слов нету, но тут консольное приложение, посему вопрос остаётся нерешённым
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
29.12.2015, 19:33
Цитата Сообщение от Just_Neshta Посмотреть сообщение
static void Main
Вообще, исторически, Main возвращала всегда int с кодами завершения. (и может возвращать если переписать).
Можно попробовать запустить процесс, с нормальной интовой Main, и посмотреть,
какие возвраты в каких случаях будут.
Но, для этого нужно будет эту прогу запустить из другого процесса или сляпать bat.

Еще вариант - перехват сообщений винды - замена WndProc - тоже можно посмотреть,
какие сообщения в каких случаях приходят.

Ну или вообщем - перехват WinAPI.

пс - Эти рекомендации скорее для исследования вопроса, чем для решения проблемы.

Добавлено через 6 минут
Тут еще почитай, мб че прокатит.
http://stackoverflow.com/quest... exit-event
0
4 / 4 / 0
Регистрация: 10.11.2014
Сообщений: 27
29.12.2015, 22:40  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Вообще, исторически, Main возвращала всегда int с кодами завершения. (и может возвращать если переписать).
Можно попробовать запустить процесс, с нормальной интовой Main, и посмотреть,
какие возвраты в каких случаях будут.
Но, для этого нужно будет эту прогу запустить из другого процесса или сляпать bat.

Еще вариант - перехват сообщений винды - замена WndProc - тоже можно посмотреть,
какие сообщения в каких случаях приходят.

Ну или вообщем - перехват WinAPI.

пс - Эти рекомендации скорее для исследования вопроса, чем для решения проблемы.

Добавлено через 6 минут
Тут еще почитай, мб че прокатит.
http://stackoverflow.com/quest... exit-event
В моём случае до конца main'a дело может просто не дойти
По остальным предложениям дельных решений не нашёл
Вопрос актуален
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2015, 22:40
Помогаю со студенческими работами здесь

Как защитить фоновые операции от преждевременного прерывания путем закрытия приложения?
Добрый день. Выполняется ряд методов которые обращаются к другим сервисам, после к бд.. и тд.. В следсвтвии чего, пользовательский...

Отслеживание закрытия стороннего приложения
Всем доброго времени суток. Нужно реализовать программу последовательного открытия .exe файлов. То есть указать 2 пути к файлам. После чего...

Перехват звука стороннего приложения
Требуется перехватит вывод звука из стороннего приложения и направить его на другой аудиоканал. Каким dll можно перехватить звук стороннего...

Перехват закрытия консольной программы
Всем снова привет :pardon: , подскажите как мне перехватить событие завершения программы ? Мне прост надо будет перед закрытием консольной...

Перехват события закрытия другого окна
Есть сторонняя программа, при закрытии она не только завершаетя, но и открывает браузер с сайтом. Можно ли засечь когда закрывают эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru