2010-04-27 6 views
1

У меня есть служба Windows, запущенная (написанная на C# .net2.0).Как отменить выключение из службы Windows C#

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

Я пробовал, но это не работает

using Microsoft.Win32; 
partial class MyService: ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     SystemEvents.SessionEnding += new SessionEndingEventHandler(OnSessionEnding); 
    } 

    private void OnSessionEnding(object sender, SessionEndingEventArgs e) 
    { 
     e.Cancel = true; 
     //Do some work... 
    } 
} 

Другой тест:

partial class MyService: ServiceBase 
{ 
    protected override void OnShutdown() 
    { 
     //Do some work... 
     //base.OnShutdown(); 
    } 
} 

ответ

4

Я бы не стал связываться с этим. Windows будет обрабатывать ваш процесс как зависающий процесс (если вы не перейдете непосредственно к API Win32).

Мое предложение было бы обратить внимание на то, что вы завершаетесь, и, возможно, планируете, чтобы действия происходили при запуске?

UPDATE:
Я думаю, что вы собираетесь застрять здесь, потому что ваша служба не будет знать, почему Windows, в настоящее время отключен. У вас будет бесконечный цикл:

  • Windows shutdown fire.
  • Служебные уведомления, прерывания выключения, запуска приложений.
  • Пользователь использует приложение для продолжения выключения.
  • Окно выключения огня.
  • Сервис уведомления ......
  • Etc.
+0

Я не могу выполнять свои действия при запуске, потому что я хочу обедать приложением winform из моей службы Windows, когда пользователь loggoff/shutdown/restart. В моем приложении winform есть кнопка «Перезапустить сейчас», а другая «Напомнить мне последнее» и проделать некоторую другую работу ... – scrat789

+0

@scrat: Еще один нет-нет, службы Windows не построены и не должны использоваться для интерактивности с графическим интерфейсом. – James

+0

@ Джеймс, он * сказал *, что его служба запускает другое приложение. –

1

Мой совет должен был бы написать свои действия в файл или реестр, например

DoSomething = true 
DoSomethingElse = false 

Что вы можете прочитать в OnStart и обработать.

1

AbortSystemShutdown может работать:

http://msdn.microsoft.com/en-us/library/aa376630%28VS.85%29.aspx

Хотя я согласен с Нилом, что это, вероятно, не очень хорошая идея, чтобы сделать это.

Edit: Добавлен пример кода

using System.Runtime.InteropServices; 

[DllImport("advapi32.dll", SetLastError=true)] 
static extern bool AbortSystemShutdown(string lpMachineName); 


if (!AbortSystemShutdown("localhost")) 
{ 
    int err = Marshal.GetLastWin32Error(); 
}   
+0

Как использовать функцию AbortSystemShutdown в C#? – scrat789

+0

Использование PInvoke. Вот некоторые сведения об этом http://www.pinvoke.net/default.aspx/advapi32/AbortSystemShutdown.html –

+0

Его старый, но у кого-нибудь есть полный образец кода для этого, пожалуйста? Я не могу найти что-нибудь для C# с Google. И просто не понимаю, где использовать каждую строку вашего примера в моем коде. Я имею в виду, что я не понимаю, куда положить часть DllImport и где использовать оператор if() для перехвата. Заранее спасибо. – user3916429

1

Вы можете использовать команду оболочки shutdown -a, чтобы отменить выключение. Я не знаю, если это возможно, чтобы обнаружить отключение хотя ...

1

Finaly я прервать идею обнаружения и отменить окна выключения/перезагрузки, Но теперь я хочу обнаружить только «завершение -r -t хх»!

Обратите внимание: операционная система, в которой работает программа, - Windows XP.

меня попробовать, но у меня нет ExitCode с WindowsXP:

Process process = new Process(); 

do 
{ 
    process.StartInfo.FileName = "shutdown.exe"; 
    process.StartInfo.Arguments = "/a"; 
    process.Start(); 
    process.WaitForExit(); 
    MessageBox.Show(string.Format("ExitCode={0}",process.ExitCode)); 
    Thread.Sleep(1000); 
} 
while (process.ExitCode != 0) ; 
+0

Я поправьте свой ответ выше с помощью фактического образца кода которые, надеюсь, будут работать, поэтому вам не нужно начинать этот процесс. –

+0

@ho Windows убивает другой процесс, прежде чем я могу обнаружить остановку, поэтому это не лучшее решение. Я решил обнаружить тайм-аут, когда «shutdown -r -t xx» прекратит запуск моей программы в это время. – scrat789

+0

Решение для обнаружения окон тайм-аута после «shutdown -r -t xx» основано на обнаружении заголовка окон: http://www.pinvoke.net/default.aspx/user32.EnumWindows – scrat789

Смежные вопросы