Agarwal1984 Ответов: 1

Как создать службу предварительного завершения работы окна с помощью C# .NET?


Привет,

Я хочу запустить систему предварительного завершения работы exe с помощью службы windows на c#.

Но как это может быть возможно, когда пользователь нажимает на кнопку shutdown и сначала запускает службу или exe перед выключением.

Я не хочу выключаться перед запуском exe.

Пожалуйста, помогите мне.

заранее спасибо.

Анкит Агарвал
инженер-программист

Что я уже пробовал:

Timer timer1 = new Timer();
       protected override void OnStart(string[] args)
       {
           try
           {
               //Debugger.Break();
               TraceService("Start Service" + " " + DateTime.Now.ToString());
               //timer1.Interval = 1000;

               timer1.Elapsed += new ElapsedEventHandler(OnElapsedTime);
               timer1.Enabled = true;
               //Debugger.Break();
           }
           catch (Exception ex)
           {
               TraceService("Error: " + ex);
               //EventLog.WriteEntry("Error: " + ex.Message);
           }
       }

       private void OnElapsedTime(object source, ElapsedEventArgs e)
       {
           try
           {

               //timer1.Stop();
               //Debugger.Break();

               timer1.Enabled = false;
               TraceService("Another entry at" + " " + DateTime.Now);
               //TraceService("System shutdown Sucessfully" + " " + DateTime.Now.ToString());
               timer1.Enabled = true;
               //WindowsServiceSchedular(timer1);
           }
           catch (Exception ex)
           {
               EventLog.WriteEntry("Error: " + ex.Message);
               TraceService("Error: " + ex);
           }
       }
       private void TraceService(string content)
       {
           try
           {

               if (!Directory.Exists(@"C:\SystemShutdown\SystemShutdownLogFile"))
                   Directory.CreateDirectory(@"C:\SystemShutdown\SystemShutdownLogFile");
               FileStream fs = new FileStream(@"C:\SystemShutdown\SystemShutdownService.Txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
               StreamWriter sw = new StreamWriter(fs);
               sw.BaseStream.Seek(0, SeekOrigin.End);
               sw.WriteLine(content);
               sw.Flush();
               sw.Close();
           }
           catch (Exception ex)
           {
               EventLog.WriteEntry("Error: " + ex.Message);
           }
       }
       protected override void OnShutdown()
       {
           TraceService("System shutdown");
           //I want to run exe in this function but firstly message is not coming when i am shutting down the computer.
           base.OnShutdown();
       }
       protected override void OnCustomCommand(int command)
       {
           base.OnCustomCommand(command);
       }
       protected override void OnStop()
       {
           timer1.Stop();
           TraceService("Stop Service");
       }

1 Ответов

Рейтинг:
4

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Проверить это - .чистая основа - C# для ОС Windows 7 запустите EXE-файл перед выключением компьютера - супер-пользователя[^]

Цитата:
Запуск процесса, когда было инициировано завершение работы, - плохая идея. На этом этапе наиболее вероятным результатом является возвращение ошибки 1115 ERROR_SHUTDOWN_IN_PROGRESS.

Гораздо лучший способ-установить службу и зарегистрировать ее для получения уведомлений о завершении работы через RegisterServiceCtrlHandlerEx, см. раздел завершение работы:

Приложения-службы получают уведомления о завершении работы в своих процедурах обработки. Чтобы зарегистрировать обработчик управления службой, используйте функцию RegisterServiceCtrlHandlerEx.

Служба C# сделала бы это, установив CanShutdown в true, а затем обработав событие OnShutdown. Важно быть службой, а не приложением, так как завершение работы может произойти, когда ни один сеанс не вошел в систему, и/или несколько сеансов могут быть запущены, когда происходит завершение работы.