完成后,WPF Console应用程序不会返回提示

时间:2014-04-10 12:51:17

标签: c# wpf command-line

我有一个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();

4 个答案:

答案 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。