Control-C、Control-Break、ログオフ、ウィンドウ X ボタンの押下などで機能するものを一緒に考え出すことはできますか?
これが私がこれまでに持っているものです:
class Program
{
private static ConsoleEventHandlerDelegate consoleHandler;
delegate bool ConsoleEventHandlerDelegate(CtrlTypes eventCode);
static void Main(string[] args)
{
consoleHandler = new ConsoleEventHandlerDelegate(ConsoleCtrlCheck);
SetConsoleCtrlHandler(consoleHandler, true);
System.Diagnostics.Process.GetCurrentProcess().Exited
+= delegate(object sender, EventArgs e)
{
GeneralManager.Stop();
};
Console.CancelKeyPress += delegate(object sender,
ConsoleCancelEventArgs e)
{
e.Cancel = false;
GeneralManager.Stop();
};
GeneralManager.Start();
}
private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
switch (ctrlType)
{
case CtrlTypes.CTRL_C_EVENT:
Console.WriteLine("CTRL+C received!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_BREAK_EVENT:
isclosing = true;
Console.WriteLine("CTRL+BREAK received!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_CLOSE_EVENT:
Console.WriteLine("Program being closed!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_LOGOFF_EVENT:
case CtrlTypes.CTRL_SHUTDOWN_EVENT:
Console.WriteLine("User is logging off!");
GeneralManager.Stop();
break;
}
return true;
}
#region unmanaged
[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ConsoleEventHandlerDelegate
handlerProc, bool add);
public delegate bool HandlerRoutine(CtrlTypes CtrlType);
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}
#endregion
}
2 つの問題:
Managed Control-Break ハンドラーで設定
e.Cancel = true
すると、.Net4 の例外で失敗します。これは、回避策のない MSDN の記事に記載されています: http://msdn.microsoft.com/en-us/library/system.consolecanceleventargs.cancel.aspxでクローズをキャンセルする方法がわかりません
ConsoleCtrlCheck
。クリーンアップを行うのに 1 ~ 2 秒かかりますが、キャンセルして、すべてが適切に行われることを確認したいと思います。
アップデート:
返信ありがとうございます。両方に賛成しました。私が求めたことを直接解決する回答を誰かが思い付くことができるかどうかを確認するのを待ちます。それ以外の場合は、「NT サービスを使用する」回答のいずれかを受け入れます。