.net 如何多次使用ConsoleCancelEventHandler

.net 如何多次使用ConsoleCancelEventHandler,.net,visual-c++,c++-cli,.net,Visual C++,C++ Cli,我一直在忙着编写一个充当前端的应用程序:它有一个GUI,可以获取带有按钮之类的命令行选项,并将它们传递给command line.exe。它使用应用程序的控制台显示命令行应用程序的输出。 这很好,但是当使用Ctrl+C或试图关闭控制台窗口时,GUI也会关闭,这并不是我真正想要的。但是,让程序用自己的控制台输出是不可能的,因为它批量处理文件,并且每个文件都会弹出自己的控制台 程序用C++编写,MSVC 2012,使用.NET。我尝试了Console::CancelKeyPress,至少让Ctrl+

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

程序用C++编写,MSVC 2012,使用.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

最后一部分是荷兰语,意思是“错误的参数”,调试器说它在读取ConsoleCancelventhandler时哽住了

如果在加载表单时仅添加一次事件处理程序,则不会执行任何操作


这是怎么回事?

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

如果您使用的是.net,请查看Process.RedirectStandardOutput(这里的示例)


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

控制台与GUI在同一进程上下文中运行。因此,任何问题或未捕获的异常都将终止整个应用程序。这就是为什么您会看到GUI也正在关闭。你能把全部代码都贴出来吗?还有一个解决方案是为每个批处理文件生成一个新进程,这不会影响GUI应用程序意外关闭/