Jawaban:
Anda dapat melakukan ini dengan beberapa kode dengan menyerahkan acara SystemEvents.SessionEnding . Ini akan menampilkan kotak dialog ketika Anda mencoba untuk logoff atau shutdown dan bertanya apakah Anda ingin membatalkan logoff atau shutdown.
Kode dapat dikompilasi secara gratis dengan Visual C # 2008 Express Edition atau dengan windows SDK .
Dengan sdk, gunakan perintah berikut:
csc.exe /out:StopShutdown.exe /target:winexe StopShutdown.cs
Berikut kodenya:
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);
}
}
}
Edit:
Jika Anda bersedia melakukan sedikit pengeditan registri ... Mulai -> Jalankan -> regedit
HKEY_CURRENT_USER \ Control Panel \ Desktop
Pastikan AutoEndTasks adalah 0, dan atur WaitToKillAppTimeout ke 20000 (nilai default 2 detik). Anda dapat menetapkan nilai lebih tinggi jika diinginkan. Ada juga HungAppTimeout (defalt adalah 5000), tetapi itu berlaku lebih untuk aplikasi yang tidak merespons.
Setiap kali saya melakukan shutdown pada XP, jika suatu program sibuk, itu memberi saya bilah kemajuan dan opsi untuk 'Akhiri Sekarang' atau 'Batalkan'.
Mengklik 'Batal' menghentikan proses penutupan. Namun, apa pun yang sudah dimatikan tidak muncul kembali.
Tapi itu memberi saya waktu untuk menghemat apa yang saya kerjakan sebelum kembali mencoba shutdown.