儘管事實上,使用GenerateConsoleCtrlEvent發送按Ctrl + C信號是需要顯著澄清得到它在不同的工作中正確的答案。 NET應用程序類型。
如果你的.NET應用程序不使用自己的控制檯(的WinForms/WPF/Windows服務/ ASP.NET)基本流程是:
- 連接主.NET程序要安慰過程
- 產生當前控制檯GenerateConsoleCtrlEvent(processGroupId控制檯的事件按Ctrl + C
- 防止主.NET從SetConsoleCtrlHandler因爲按Ctrl + C事件停止過程應該是零!與發送p.SessionId代碼答案不工作和不正確)
012從控制檯
- 斷開和恢復按Ctrl + C的主要工藝處理
下面的代碼片段說明如何做到這一點:
Process p;
if (AttachConsole((uint)p.Id)) {
SetConsoleCtrlHandler(null, true);
try {
if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT,0))
return false;
p.WaitForExit();
} finally {
FreeConsole();
SetConsoleCtrlHandler(null, false);
}
return true;
}
其中SetConsoleCtrlHandler,FreeConsole,AttachConsole和GenerateConsoleCtrlEvent是本地WinAPI的方法:
internal const int CTRL_C_EVENT = 0;
[DllImport("kernel32.dll")]
internal static extern bool GenerateConsoleCtrlEvent(uint dwCtrlEvent, uint dwProcessGroupId);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool AttachConsole(uint dwProcessId);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
internal static extern bool FreeConsole();
[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
// Delegate type to be used as the Handler Routine for SCCH
delegate Boolean ConsoleCtrlDelegate(uint CtrlType);
如果您需要從.NET控制檯應用程序發送Ctrl + C,事情會變得更加複雜。方法不會工作,因爲AttachConsole在這種情況下返回false(主控制檯應用程序已經有一個控制檯)。可以在AttachConsole調用之前調用FreeConsole,但結果是原始的.NET應用程序控制臺將丟失,這在大多數情況下是不可接受的。
我對這種情況下的解決方案(中真正起作用的,並且沒有副作用.NET主要工藝控制檯):
- 創建命令行參數的接受進程ID小的支持.NET控制檯程序,失去其自己的控制檯FreeConsole AttachConsole呼叫之前,發送Ctrl + C可針對以上
- 主要.NET控制檯進程中提到碼進程只是在調用新工藝此實用工具時,它需要按Ctrl + C發送到另一臺主機的過程
請注意,只有當進程正在嘗試從標準輸入讀取時,它才起作用。直到程序試圖從中讀取某些東西,關閉stdin纔會執行任何操作。 – Doug 2013-03-12 23:00:50