バックグラウンドでコンソール アプリケーションを起動する Windows フォームがあります (CreateNoWindow = rue、WindowStyle = ProcessWindowStyle.Hidden)。
Windows フォームでは、いつでもコンソール アプリケーションを停止できます。しかし、コンソール アプリケーション内で何らかの形でクローズ メッセージを処理したいと考えています。私は次のようなフックを使用しようとしました:
[DllImport("Kernel32")]
public static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool add);
// A delegate type to be used as the handler routine
// for SetConsoleCtrlHandler.
public delegate bool HandlerRoutine(CtrlTypes ctrlType);
// An enumerated type for the control messages
// sent to the handler routine.
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}
private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
StaticLogger.Instance.DebugFormat("Main: ConsoleCtrlCheck: Got event {0}.", ctrlType);
if (ctrlType == CtrlTypes.CTRL_CLOSE_EVENT)
{
// Handle close stuff
}
return true;
}
static int Main(string[] args)
{
// Subscribing
HandlerRoutine hr = new HandlerRoutine(ConsoleCtrlCheck);
SetConsoleCtrlHandler(hr, true);
// Doing stuff
}
しかし、コンソールウィンドウが作成された場合にのみ ConsoleCtrlCheck 内にメッセージが表示されます。しかし、ウィンドウが非表示の場合、メッセージは表示されません。
コンソール アプリケーション プロセスを閉じるための Windows フォームでは、proc.CloseMainWindow(); を使用します。コンソール ウィンドウにメッセージを送信します。
PS AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; - また、役に立たない
この状況を処理する別の方法はありますか?ありがとう。