С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
.NET 3.x

Как перехватить закрытие Windows-приложения без формы

25.01.2012, 06:37. Показов 2673. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я на C# создал приложение, выбрав проект WindowsForms. Но так как моя программа не должна иметь никаких окон, я удалил Form1.cs, а код своей программы поместил в функции Main() типа так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main()
{
     FileSystemWatcher watcher = new FileSystemWatcher();
     watcher.Path = "C:\\";
     watcher.NotifyFilter = NotifyFilters.LastAccess;
     watcher.Changed += new FileSystemEventHandler(OnChanged);
     watcher.Created += new FileSystemEventHandler(OnChanged);
     watcher.Deleted += new FileSystemEventHandler(OnChanged);
     watcher.Renamed += new RenamedEventHandler(OnRenamed);
            
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run();
}
после Мейна идут фукнции-обработчики событий, который пишут все в текстовый файл.
Мне надо так сделать, чтобы при выключении компьютера, когда система посылает всем программам команду закрыться, чтобы в этот момент моя программа перед своим закрытием сбрасывала содержимое всех буферов файлового потока в файл (то есть, выполнялась функция Flush()), а то сейчас получается неприятная ситуация, что мое приложение виндой убивается, и все данные, что должны были записаться в файл, но остались в буфере файлового потока, так и пропадают, не записавшись в файл.

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

P.S. Как перехвачивать закрытие приложения с формой, я знаю. Но просто в моем приложении нет формы...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2012, 06:37
Ответы с готовыми решениями:

Как перехватить и обработать закрытие окна броузера?
О наличии событий onunload и onbeforeunload я, разумеется, знаю, но они возникают не только при закрытии окна броузера, но и в ряде других...

Как перехватить такое событие как закрытие текущего окна броузера?
Как перехватить такое событие как закрытие текущего окна броузера?

ClientDataSet закрытие приложения без сохранения результатов
Открываю приложение, работаю с ClientDataSet - и возникает желание выйти из программы без сохранения результатов. КАК это реализовать?????

2
Заблокирован
25.01.2012, 07:16
Tolias28, попробуй это
C#
1
2
3
4
5
6
7
    Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
.................................
     
        void Application_ApplicationExit(object sender, EventArgs e)
        {
 
        }
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
26.01.2012, 02:37  [ТС]
vglbch, в том то и дело, что событие ApplicationExit почему то не происходит..
Я также пробовал подписываться на другие события, такие как Application.ThreadExit и AppDomain.CurrentDomain.ProcessExit, но ни то ни другое событие не происходит при закрытии приложения виндой. Уже надоело из-за этих тестов комп перезагружать... А как можно еще послать команду приложению закрыться, чтобы компьютер перезагрузками не мучать? Я для тестов написал вот такое приложение для послания команды закрыться:
C#
1
2
3
4
5
6
7
8
9
10
private void buttonRun_Click(object sender, EventArgs e)
{
    processPath = "F:\\Projects\\C#\\Test\\FSEvents\\FSEvents\\bin\\Debug\\FSEvents.exe";
    this.process = System.Diagnostics.Process.Start(processPath);
}
        
private void buttonExit_Click(object sender, EventArgs e)
{
    process.CloseMainWindow();
}
но оно не закрывает приложение FSEvents.exe
Если я для примера напишу в processPath "notepad.exe", то он кнопкой Run запускается и кнопкой Exit закрывается. А если FSEvents.exe написать, то открывать он его открывает, а кнопка Exit не действует на него никак То есть, приложение FSEvents.exe продолжает работать.

Вот полный код моего приложения FSEvents. Может я где-то и накрутил, из-за того и не работает событие... Покажите пожалуйста.

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Windows.Forms;
using System.IO;
 
namespace FSEvents
{
    static class Program
    {
        public static StreamWriter flog;
        public static string fileLogName = "history.txt";
        public static string fileSettingsName = "settings.ini";
        public static DateTime dt = DateTime.Now;
        public static DateTime dtNow;
 
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            flog = new StreamWriter(fileLogName, true);
            flog.WriteLine("{0} FS START", dt);
            StreamReader fileSettings;
            try
            {
                fileSettings = new StreamReader(fileSettingsName);
            }
            catch (Exception e)
            {
                flog.WriteLine("{0} ERROR. {1}", DateTime.Now, e.Message);
                flog.Close();
                return;
            }
 
            string nameDrives = fileSettings.ReadLine(); ////
            if (nameDrives == null)
            {
                flog.WriteLine("{0} ERROR. File '{1}' not have drive letters", DateTime.Now, fileSettingsName);
                flog.Close();
                return;
            }
            int numberDrives = nameDrives.Length;
            FileSystemWatcher[] fsw = new FileSystemWatcher[numberDrives];
            //  Create a FileSystemWatcher to monitor all files on drives.
            for (int i = 0; i < numberDrives; i++)
            {
                try
                {
                    fsw[i] = new FileSystemWatcher(nameDrives[i] + ":\\");
 
                    //  Watch for changes in LastAccess and LastWrite times, and
                    //  the renaming of files or directories. 
                    fsw[i].NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                        | NotifyFilters.FileName | NotifyFilters.DirectoryName;
 
                    //  Register a handler that gets called when a 
                    //  file is created, changed, or deleted.
                    fsw[i].Changed += new FileSystemEventHandler(OnChanged);
 
                    fsw[i].Created += new FileSystemEventHandler(OnChanged);
 
                    fsw[i].Deleted += new FileSystemEventHandler(OnChanged);
 
                    //  Register a handler that gets called when a file is renamed.
                    fsw[i].Renamed += new RenamedEventHandler(OnRenamed);
 
                    //  Register a handler that gets called if the 
                    //  FileSystemWatcher needs to report an error.
                    fsw[i].Error += new ErrorEventHandler(OnError);
 
                    //  Begin watching.
                    fsw[i].EnableRaisingEvents = true;
                }
                catch (Exception e)
                {
                    flog.WriteLine("{0} ERROR. {1}", DateTime.Now, e.Message);
                }
            }
            Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
            Application.ThreadExit += new EventHandler(Application_ApplicationExit);
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(Application_ApplicationExit);  
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run();
        }
 
        //  This method is called when a file is created, changed, or deleted.
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            //  Show that a file has been created, changed, or deleted.
            dtNow = DateTime.Now;
            WatcherChangeTypes wct = e.ChangeType;
            try
            {
                flog.WriteLine("{2} \"{0}\" {1}", e.FullPath, wct.ToString(), dtNow);
            }
            catch
            {
                return;
            }
            ForceFlush();
        }
 
        //  This method is called when a file is renamed.
        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            //  Show that a file has been renamed.
            dtNow = DateTime.Now;
            WatcherChangeTypes wct = e.ChangeType;
            try
            {
                flog.WriteLine("{3} \"{0}\" {2} to \"{1}\"", e.OldFullPath, e.FullPath, wct.ToString(), dtNow);
            }
            catch
            {
                return;
            }
            ForceFlush();
        }
 
        //  This method is called when the FileSystemWatcher detects an error.
        private static void OnError(object source, ErrorEventArgs e)
        {
            //  Show that an error has been detected.
            dtNow = DateTime.Now;
            flog.WriteLine("{0} The FileSystemWatcher has detected an error", dtNow);
            //  Give more information if the error is due to an internal buffer overflow.
            if (e.GetException().GetType() == typeof(InternalBufferOverflowException))
            {
                //  This can happen if Windows is reporting many file system events quickly 
                //  and internal buffer of the  FileSystemWatcher is not large enough to handle this
                //  rate of events. The InternalBufferOverflowException error informs the application
                //  that some of the file system events are being lost.
                flog.WriteLine(("{0} The file system watcher experienced an internal buffer overflow: " + e.GetException().Message), dtNow);
            }
            ForceFlush();
        }
 
        private static void ForceFlush()
        {
            if (dtNow.Minute != dt.Minute)
                flog.Flush();
            dt = dtNow;
        }
 
        private static void Application_ApplicationExit(object sender, EventArgs e)
        {
            MessageBox.Show("ApplicationExit"); //for tests... delete after tests
            flog.WriteLine("{0} FS EXIT", DateTime.Now);
            flog.Close();
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2012, 02:37
Помогаю со студенческими работами здесь

Как создавать приложения без формы в C++ Builder 2007?
Извините за глупый вопрос,но как создавать приложения без формы в 2007 билдере?он не хочет компелировать unit

Как изменить иконку для приложения без формы
Пробовал подменять в EXE-шнике c помощью: Resource Hacker IcoFX взяв за основу готовую иконку. Результат одинаков и не очень...

Закрытие формы без сохранения записи
Добрый день! Сделал форму на основе таблицы для добавления записи. В таблице, естественно, есть обязательные поля. Если хоть чего в любое...

Закрытие формы без вывода сообщения
Всем привет! Проблема такая: Когда я создаю файл и он пуст,то форма закрывается! Когда я создал файл и написал что-либо в нем,то выводит...

Закрытие первой формы без закрытия остальных
У меня есть 3 формы: MainMn, LevelHr, GameFld. При нажатии на кнопку Начать в первой форме: MainMn-&gt;Close(); ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru