Odpowiedzi:
Możesz to zrobić za pomocą kodu, przekazując zdarzenie SystemEvents.SessionEnding . Wyświetli się okno dialogowe, gdy spróbujesz się wylogować lub zamknąć i zapytać, czy chcesz anulować wylogowanie lub zamknięcie.
Kod można skompilować za darmo za pomocą Visual C # 2008 Express Edition lub Windows SDK .
Za pomocą sdk użyj następującego polecenia:
csc.exe /out:StopShutdown.exe /target:winexe StopShutdown.cs
Oto kod:
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);
}
}
}
Edytować:
Jeśli chcesz przeprowadzić niewielką edycję rejestru ... Start -> Uruchom -> regedit
HKEY_CURRENT_USER \ Control Panel \ Desktop
Upewnij się, że AutoEndTasks ma wartość 0, i ustaw opcję WaitToKillAppTimeout na 20000 (wartość domyślna 2 sekundy). Jeśli chcesz, możesz ustawić wyższą wartość. Istnieje również HungAppTimeout (defalt to 5000), ale dotyczy to w większym stopniu aplikacji, które nie odpowiadają.
Za każdym razem, gdy zamykam XP, program jest zajęty, daje mi pasek postępu i opcję „Zakończ teraz” lub „Anuluj”.
Kliknięcie „Anuluj” zatrzymuje proces zamykania. Jednak to, co już zostało zamknięte, nie wraca.
Daje mi to jednak czas na zaoszczędzenie tego, nad czym pracowałem przed ponowną próbą zamknięcia.