WPF控制台应用程序在完成后不会返回提示符

5
我有一个WPF应用程序,当传递命令行参数时,它会作为命令行应用程序运行。为了显示/获取命令行窗口,我使用以下代码。
当我运行应用程序时,一切都按预期工作。如果我在应用程序中向控制台输出任何内容,则应用程序不会自动从控制台退出,我必须按“Enter”键或者调用某种ReadLine - 注意,我根本没有在我的应用程序中使用ReadLine。实际上,我可以只使用这个简单的代码来使此行为发生。如何防止应用程序运行后需要“按Enter”?
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的建议,我尝试在WriteLine后直接使用FreeConsole,但仍然无效。

[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();

可能是重复的问题:https://dev59.com/UGMm5IYBdhLWcg3wFLw4 - noseratio - open to work
4个回答

1

我遇到了同样的问题,完全同意Cris的发现。

仔细观察控制台后,我意识到在运行应用程序后,提示符会立即在控制台中打印出来。输出文本是在提示符之后打印的。

所以基本上按下回车键只会打印另一个空的提示符。

例如:MyWpfApp with Console.WriteLine("hey");

看起来像这样:

C:> MyWpfApp

C:> hey

这里没有新的空提示符。

实际上,控制台已经显示了提示符,但在此之后添加了完整的输出(甚至包括多行输出,这使得更难意识到提示符是在它们之前打印的)。

因此,应用程序执行似乎未完成,但实际上进程已经完成,控制台中的任何进一步按键都直接发送到cmd。


0

在编写完控制台内容后,使用FreeConsole()方法释放附加到您的应用程序的控制台。

if (!Startup.AttachConsole(-1))
{ 
    // Attach to an parent process console
    Startup.AllocConsole(); // Alloc a new console
}

Console.WriteLine("hey");
Startup.FreeConsole();

我尝试了这个,但它没有做任何事情... 我会更新我的问题并附上所使用的代码。 - Chris

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
    }

我并不会同时创建应用程序和控制台,我会有所选择。我会在问题中更新更多的代码。 - Chris
我知道。然而,Environment.Exit(0)应该为您执行必要的清理工作。 - Jeff
你不会按Ctrl-F5来运行这个程序吧? - Jeff
我明白了。在这种情况下,控制台最初并不是由您分配的,因此其他引用仍然存在,它不会消失。您只需附加到当前控制台以进行标准输入/输出重定向即可。 - Jeff
是的,没错,但我的应用程序完成后,不应该退出到正常的命令提示符吗?如果我不向控制台输出任何内容,它就可以工作(即使已经放置了附加等). - Chris
显示剩余3条评论

0

问题似乎出在Console.Out的惰性初始化上,当通过GetStdHandle(STD_OUTPUT_HANDLE)获取句柄时。 为了等待提示返回并成功将控制台输出导入日志,应使用start /b /wait myGuiApp > mylog.txt启动应用程序。

所有功劳归于arx: https://dev59.com/8Ggu5IYBdhLWcg3wK0Gr#11526152


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接