我一直忙于编写一个充当前端的应用程序:它有一个 GUI,可以使用按钮和类似的东西来获取命令行选项,并将它们传递给命令行 .exe。它使用应用程序的控制台来显示命令行应用程序的输出。
这工作正常,但是当使用 Ctrl+C 或尝试关闭控制台窗口时,GUI 也会关闭,这并不是我真正想要的。然而,让程序用它自己的控制台输出是不可能的,因为它批处理文件并且每个文件都会弹出它自己的控制台。
该程序是使用 MSVC 2012 用 C++ 编写的,并使用 .NET。我尝试了 Console::CancelKeyPress 至少让 Ctrl+C 表现得像我想要的那样(停止命令行应用程序,但不停止 GUI),但遇到了一些问题。
My code
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 时感到窒息。
如果我尝试通过在加载表单时添加事件处理程序来仅添加一次事件处理程序,则它不会执行任何操作。
这里发生了什么?