【问题标题】:WPF Console app doesnt return to prompt once finishedWPF 控制台应用程序完成后不会返回提示
【发布时间】:2014-04-10 12:51:16
【问题描述】:

我有一个 WPF 应用程序,当传递命令行参数时,它作为命令行应用程序运行。要显示/获取命令行窗口,我使用以下代码。

当我运行应用程序时,一切都按预期工作。如果我在应用程序期间向控制台写入任何内容,则应用程序不会自动退出控制台,我必须按“输入”或基本上调用某种 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();

【问题讨论】:

标签: c# wpf command-line


【解决方案1】:

在您的模态主窗口完成后,使用类似于以下的代码清理所有应用程序资源:

    [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
    }

【讨论】:

  • 我实际上并没有同时创建 App 和 Console,我有选择性地选择。我会用更多代码更新问题
  • 我明白了。不过,Environment.Exit(0) 应该为您执行必要的清理工作。
  • 不幸的是它仍然无法正常工作......我留下的控制台应用程序不会返回命令提示符,除非我之后按回车
  • 你没有按 Ctrl-F5 来运行它,是吗?
  • 我刚刚创建了一个测试项目并使用了您的代码,但我没有得到相同的结果。显示“嘿”后控制台立​​即消失。
【解决方案2】:

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

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

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

【讨论】:

  • 我试过这个,但它没有做任何事情......我会用使用的代码更新我的问题
【解决方案3】:

问题似乎是Console.Out的延迟初始化,当句柄被GetStdHandle(STD_OUTPUT_HANDLE)获取时 要等待提示返回并将控制台输出成功通过管道传输到日志,需要使用 start /b /wait myGuiApp &gt; mylog.txt 启动应用程序

所有功劳归于 arx: https://stackoverflow.com/a/11526152/1374375

【讨论】:

    【解决方案4】:

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

    更仔细地查看控制台,我意识到在运行应用程序后立即在控制台中打印了提示。 输出文本在提示之后打印。

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

    例如MyWpfApp 与 Console.WriteLine("hey");

    看起来像这样:

    C:> MyWpfApp

    C:> 嘿

    这里没有新的空提示。

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

    所以应用程序执行似乎没有完成,但实际上该过程已经完成,并且控制台中的任何进一步击键都直接发送到 cmd。

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 2021-09-12
      • 2018-12-07
      • 2011-12-27
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2020-05-12
      相关资源
      最近更新 更多