ktm*_*tmf 5 .net c++-cli visual-c++
我一直在忙着编写一个充当前端的应用程序:它有一个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);
}
Run Code Online (Sandbox Code Playgroud)
每次用户尝试运行要处理的批处理文件时,都会调用此方法.运行批处理后,控制台随FreeConsole()一起发布.第一次它运行良好并使用Ctrl + C杀死命令行应用程序,但GUI中的处理继续,运行其他命令,最后使用FreeConsole().但是,当第二次尝试这样做时,它也会杀死GUI.我尝试在添加新事件之前添加此项以删除上一个事件
Console::CancelKeyPress -=
gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);
Run Code Online (Sandbox Code Playgroud)
但不知何故,这会在添加处理程序时引发错误,但只是第二次:mscorlib.dll中出现未处理的类型'System.IO.IOException'异常,附加信息:De参数是onjuist.
最后一部分是荷兰语的"错误论证",而调试人员说它在读取ConsoleCancelEventHandler时会窒息.
如果我尝试通过在加载表单时添加它只添加一次事件处理程序,它什么都不做.
这里发生了什么?
您是否考虑过在不同的进程中运行该批处理?然后,您可以通过读取生成进程的 stdout(和 stderror)来显示批处理进程的输出。
如果您使用的是 .net,请查看 Process.RedirectStandardOutput (此处的示例来自 .NET 应用程序 (C#) 的捕获控制台输出)。
如果隐藏生成的进程,则用户无法与其交互/关闭它。您的主应用程序仍然处于完全控制状态,并且 ctrl-c 等没有任何问题。
归档时间: |
|
查看次数: |
383 次 |
最近记录: |