Respostas:
Você pode fazer isso com algum código entregando o evento SystemEvents.SessionEnding . Isso exibirá uma caixa de diálogo quando você tentar fazer logoff ou desligamento e perguntar se deseja cancelar o logoff ou desligamento.
O código pode ser compilado gratuitamente com o Visual C # 2008 Express Edition ou com o Windows SDK .
Com o sdk, use o seguinte comando:
csc.exe /out:StopShutdown.exe /target:winexe StopShutdown.cs
Aqui está o código:
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);
}
}
}
Editar:
Se você estiver disposto a editar um pouco o registro ... Iniciar -> Executar -> regedit
HKEY_CURRENT_USER \ Painel de controle \ Área de trabalho
Verifique se AutoEndTasks é 0 e defina WaitToKillAppTimeout como 20000 (o valor padrão de 2 segundos). Você pode definir o valor mais alto, se desejar. Há também o HungAppTimeout (o padrão é 5000), mas isso se aplica mais a aplicativos que não estão respondendo.
Sempre que eu faço um desligamento no XP, se um programa está ocupado, isso me dá uma barra de progresso e uma opção para 'Finalizar agora' ou 'Cancelar'.
Clicar em 'Cancelar' interrompe o processo de desligamento. No entanto, o que já foi encerrado não volta.
Mas isso me dá tempo para salvar o que eu estava trabalhando antes de tentar novamente o desligamento.