如何多次使用ConsoleCancelEventHandler

时间:2013-04-19 09:31:41

标签: .net visual-c++ c++-cli

我一直在忙着编写一个充当前端的应用程序:它有一个GUI,带有按钮等命令行选项,并将它们传递给命令行.exe。它使用应用程序的控制台来显示命令行应用程序的输出。 这很好用,但是当使用Ctrl + C或尝试关闭控制台窗口时,GUI也会关闭,这不是我想要的。但是,让程序输出自己的控制台是不可能的,因为它批处理文件,每个文件都会弹出它自己的控制台。

该程序使用MSVC 2012以C ++编写,并使用.NET。我试过Console :: CancelKeyPress至少得到Ctrl + C的行为,因为我想要它(停止命令行应用程序,但不是GUI),但有一些麻烦。

我的代码

private: System::Void OnCancelKeyPressed(System::Object^  sender, System::ConsoleCancelEventArgs^  e) {
         e->Cancel = true;
     }
private: System::Void GetConsoleReady() {
         COORD c;
         FreeConsole();
         AllocConsole();
         c.X = 80; c.Y = 8000;
         SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),c);
         Console::Clear();
         Console::TreatControlCAsInput = false;
         Console::CancelKeyPress += 
             gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);  
     }

每次用户尝试运行要处理的批处理文件时,都会调用此方法。运行批处理后,控制台随FreeConsole()一起发布。第一次它运行良好并使用Ctrl + C杀死命令行应用程序,但GUI中的处理继续,运行其他命令,最后使用FreeConsole()。但是,当第二次尝试这样做时,它也会杀死GUI。我尝试在添加新事件之前添加此项以删除上一个事件

             Console::CancelKeyPress -= 
             gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);  

但不知何故,这会在添加处理程序时引发错误,但只是第二次:mscorlib.dll中出现未处理的“System.IO.IOException”类型的异常,附加信息:De参数是onjuist。

最后一部分是'错误的参数'的荷兰语,调试器说它在读取ConsoleCancelEventHandler时会窒息。

如果我尝试通过在加载表单时添加事件处理程序只添加一次,它什么都不做。

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

您是否考虑过在不同的流程中运行批处理?然后,您可以通过读取生成的进程的stdout(和stderror)来显示批处理的输出。

如果您使用的是.net,请查看Process.RedirectStandardOutput(此处为Capturing console output from a .NET application (C#)示例)。

如果隐藏生成的进程,则用户无法与其进行交互/关闭它。您的主应用程序仍然完全控制,ctrl-c等没有问题。