我有一个WPF应用程序,当传递命令行参数时,它作为命令行应用程序运行。要显示/获取命令行窗口,我使用以下代码。
当我运行应用程序时,一切都按预期工作。如果我在应用程序期间向控制台写了任何内容,那么应用程序不会自动退出控制台,我必须按"输入"或者基本上调用某种ReadLine
- 注意我根本没有在我的应用中使用ReadLine
。事实上,我只能使用这个简单的代码来实现这种行为。如何防止要求按下输入"一旦应用程序运行了吗?
public static void Main(string[] args)
{
if (args.Length == 0)
{
App app = new App();
app.Run(new MainWindow());
}
else
{
// attach to an parent process console
if (!NativeMethods.AttachConsole(-1))
{
// allocate a new console
NativeMethods.AllocConsole();
}
Console.WriteLine("hey");
NativeMethods.FreeConsole();
}
}
我使用以下方法进行Alloc / Attach / Free。请注意,根据Rohit的建议,我在FreeConsole
之后直接尝试了WriteLine
,但它仍然没有帮助
[DllImport("kernel32.dll")]
private static extern bool AllocConsole();
[DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int FreeConsole();
答案 0 :(得分:0)
只要您完成向控制台的写入操作,就可以使用 FreeConsole()
方法将附加的控制台发布到您的应用中。
if (!Startup.AttachConsole(-1))
{
// Attach to an parent process console
Startup.AllocConsole(); // Alloc a new console
}
Console.WriteLine("hey");
Startup.FreeConsole();
答案 1 :(得分:0)
完成模态主窗口后,使用类似于以下内容的代码清理所有应用程序资源:
[STAThread()]
internal static void Main()
{
// [Your startup code here]
Application app = new Application();
app.DispatcherUnhandledException += DispatcherUnhandledException;
app.MainWindow = new MainWindow();
app.MainWindow.ShowDialog();
Console.WriteLine("Terminating...");
Startup.FreeConsole();
// http://msdn.microsoft.com/en-us/library/ms597014(v=vs.110).aspx
app.Shutdown(0); // <-- or Application.Current.Shutdown(0);
// http://msdn.microsoft.com/en-us/library/system.environment.exit.aspx
Environment.Exit(0); // <-- a bit redundant however
}
答案 2 :(得分:0)
问题似乎是Console.Out
的延迟初始化,当GetStdHandle(STD_OUTPUT_HANDLE)
获取句柄时
要等待提示返回并将控制台输出成功传递到日志,应用程序需要以start /b /wait myGuiApp > mylog.txt
所有功劳都归功于arx: https://stackoverflow.com/a/11526152/1374375
答案 3 :(得分:0)
我遇到了同样的问题,完全可以同意Cris的发现。
更靠近控制台,我意识到在运行应用程序后立即在控制台中打印了提示。 在提示后输出输出文本。
因此基本上按回车键只会显示另一个空提示。
例如具有Console.WriteLine(“ hey”);的MyWpfApp;
会是这样的:
C:> MyWpfApp
C:>嘿
此处没有新的空白提示。
控制台实际上已经显示了提示,但之后又添加了完整的输出(即使有多行输出,这也使得更难以意识到在提示之前已打印了提示)。
因此,应用程序执行似乎未完成,但实际上该过程已完成,并且控制台中的任何其他按键都直接发送到cmd。