답변:
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 \ 제어판 \ 데스크탑
AutoEndTasks가 0인지 확인하고 WaitToKillAppTimeout을 20000 (기본값 2 초)으로 설정하십시오. 원하는 경우 값을 더 높게 설정할 수 있습니다. HungAppTimeout (소거는 5000)도 있지만 응답하지 않는 응용 프로그램에 더 많이 적용됩니다.
XP에서 종료 할 때마다 프로그램이 사용중인 경우 진행률 표시 줄과 '지금 종료'또는 '취소'에 대한 옵션이 표시됩니다.
'취소'를 클릭하면 종료 프로세스가 중지됩니다. 그러나 이미 종료 된 항목은 다시 나타나지 않습니다.
그러나 종료를 다시 시도하기 전에 내가하고 있던 작업을 저장할 시간을줍니다.