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

最後に、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 に答える
1

シェル コマンドshutdown -aを使用して、シャットダウンを中止できます。シャットダウンを検出できるかどうかはわかりませんが...

于 2010-04-27T10:58:36.427 に答える