これで運が良かったですか?私の理解では、コンソールで CTRL+C を押すと、デフォルトでは、親プロセスだけでなく、コンソールに接続されているすべてのプロセスがそれを受け取ります。次に例を示します。
Child.cs:
using System;
public class MyClass
{
public static void CtrlCHandler(object sender, ConsoleCancelEventArgs args)
{
Console.WriteLine("Child killed by CTRL+C.");
}
public static void Main()
{
Console.WriteLine("Child start.");
Console.CancelKeyPress += CtrlCHandler;
System.Threading.Thread.Sleep(4000);
Console.WriteLine("Child finish.");
}
}
親.cs:
using System;
public class MyClass
{
public static void CtrlCHandler(object sender, ConsoleCancelEventArgs args)
{
Console.WriteLine("Parent killed by CTRL+C.");
}
public static void Main()
{
Console.CancelKeyPress += CtrlCHandler;
Console.WriteLine("Parent start.");
System.Diagnostics.Process child = new System.Diagnostics.Process();
child.StartInfo.UseShellExecute = false;
child.StartInfo.FileName = "child.exe";
child.Start();
child.WaitForExit();
Console.WriteLine("Parent finish.");
}
}
出力:
Y:\>parent
Parent start.
Child start.
Parent killed by CTRL+C.
Child killed by CTRL+C.
^C
Y:\>parent
Parent start.
Child start.
Child finish.
Parent finish.
だから、何か特別なことをする必要があるとは思わなかったでしょう。ただし、実際に CTRL+C イベントを自分で生成する必要がある場合は、それほど簡単ではない可能性があります。あなたが説明した問題についてはよくわかりませんが、私が知る限り、コンソール ウィンドウに接続されているすべてのプロセスに CTRL+C イベントしか送信できません。プロセスをデタッチすると、CTRL+C イベントを送信できなくなります。CTRL+C イベントを送信するプロセスを選択したい場合は、すべてのプロセスに対して新しいコンソール ウィンドウを作成する必要があるようです。ウィンドウを表示せずにそれを行う方法があるかどうか、またはパイプを使用して I/O をリダイレクトしたい場合に何か方法があるかどうかはわかりません。