У меня есть форма 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 ();
отправить сообщение в окно консоли.
P.S. AppDomain.CurrentDomain.ProcessExit + = CurrentDomain_ProcessExit; - тоже не помогает
Есть ли у вас другой способ справиться с этой ситуацией?
Спасибо.