回答:
SystemEvents.SessionEndingイベントを渡すことにより、いくつかのコードでこれを行うことができます。これにより、ログオフまたはシャットダウンしようとしたときにダイアログボックスが表示され、ログオフまたはシャットダウンをキャンセルするかどうかを尋ねられます。
コードは、Visual C#2008 Express EditionまたはWindows SDKを使用して無料でコンパイルできます。
SDKでは、次のコマンドを使用します。
csc.exe /out:StopShutdown.exe /target:winexe StopShutdown.cs
コードは次のとおりです。
using System;
using System.Windows.Forms;
using Microsoft.Win32;
namespace StopShutdown
{
static class Program
{
[STAThread]
static void Main()
{
string desktopRegKey = @"HKEY_CURRENT_USER\Control Panel\Desktop";
Registry.SetValue(desktopRegKey, "AutoEndTasks", 0);
Registry.SetValue(desktopRegKey, "WaitToKillAppTimeout", 20000);
Registry.SetValue(desktopRegKey, "HungAppTimeout", 20000);
Form AppForm = new Form()
{
ClientSize = new System.Drawing.Size(0, 0),
ControlBox = false,
FormBorderStyle = FormBorderStyle.None,
Opacity = 0,
ShowIcon = false,
ShowInTaskbar = false,
SizeGripStyle = SizeGripStyle.Hide,
};
SystemEvents.SessionEnding += (_e, e) =>
{
DialogResult dr = MessageBox.Show(
"Cancel shutdown?"
, "Shutdown",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1);
e.Cancel = (dr == DialogResult.Yes);
};
Application.Run(AppForm);
}
}
}
編集:
レジストリを少し編集したい場合...スタート->実行-> regedit
HKEY_CURRENT_USER \ Control Panel \ Desktop
AutoEndTasksが0であることを確認し、WaitToKillAppTimeoutを20000(デフォルト値の2秒)に設定します。必要に応じて、値を高く設定できます。HungAppTimeout(デフォルトは5000)もありますが、これは応答しないアプリケーションにさらに当てはまります。
XPでシャットダウンを実行するたびに、プログラムがビジー状態の場合は、進行状況バーと「今すぐ終了」または「キャンセル」のオプションが表示されます。
[キャンセル]をクリックすると、シャットダウンプロセスが停止します。ただし、すでにシャットダウンされているものは元に戻りません。
しかし、シャットダウンを再試行する前に、私が行っていた作業を保存する時間は与えられます。