1

我启动了一个 Windows 服务(用 C# .net2.0 编写)。

我想检测计算机何时关闭/重新启动并取消它。取消后我想做一些操作并重新启动窗口。

我试过了,但它不起作用

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

6 回答 6

4

我不会惹这个。Windows 会将您的进程视为挂起的进程(除非您直接访问 Win32 API)。

我的建议是注意您正在关闭,并可能安排活动在启动时发生?

更新:
我认为你会被困在这里,因为你的服务不知道为什么Windows 被关闭。您将有一个无限循环:

  • Windows 关机触发。
  • 服务通知,中止关闭,启动应用程序。
  • 用户使用应用程序继续关机。
  • 窗口关闭火灾。
  • 服务通知......
  • 等等。
于 2010-04-27T09:49:00.897 回答
1

我的建议是将您的操作写入文件或注册表,例如

DoSomething = true
DoSomethingElse = false

您可以阅读OnStart和处理。

于 2010-04-27T09:53:39.790 回答
1

AbortSystemShutdown可能工作:

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

尽管我同意尼尔的观点,但这样做可能不是一个好主意。

编辑:添加示例代码

using System.Runtime.InteropServices;

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


if (!AbortSystemShutdown("localhost"))
{
    int err = Marshal.GetLastWin32Error();
}        
于 2010-04-27T09:55:19.310 回答
1

您可以使用 shell 命令shutdown -a中止关机。我不知道是否有可能检测到关机...

于 2010-04-27T10:58:36.427 回答
1

最后,我放弃了检测并取消 Windows 关机/重启的想法,但现在我只想检测“shutdown -r -t xx”

请注意运行程序的操作系统是 Windows XP。

我试过了,但我没有 WindowsXP 的 ExitCode:

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) ;
于 2010-04-28T09:10:03.897 回答
1

解决方案是通过 winform 检测关机:http: //msdn.microsoft.com/fr-fr/library/microsoft.win32.systemevents.sessionending%28VS.80%29.aspx

但是 Windows 在我检测到它之前就杀死了其他进程,所以这不是更好的解决方案!

于 2010-04-28T09:16:02.620 回答