Форум программистов, компьютерный форум, киберфорум
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. Показов 2702. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru