在WPF项目中实现命令行运行

时间:2012-08-31 20:33:27

标签: c# wpf

我想在WPF项目中实现命令行运行。 App.c中的入口点已更改。但控制台只会闪烁然后消失。如何解决?感谢

public class App : System.Windows.Application
{
    [STAThread]
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {// Commandline run mode
            // Command line given, console from console
            Console.WriteLine("In cmd line mode");
            AllocConsole();
            CmdLineRun.ParseArgs(args);
            CmdLineRun.CmdRun();
        }
        else
        {// GUI mode
            GUIMain();
        }
    }

    static void GUIMain()
    {
        App app = new App();
        app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
        app.Run();
    }

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AllocConsole();
}

1 个答案:

答案 0 :(得分:5)

当您使用AllocConsole创建新的控制台窗口时,它只会在您的流程仍处于活动状态时粘贴。为了防止这种情况,您有几个选择:

  1. 在用户提供某些输入之前,请勿实际终止您的流程。这是您的陈词滥调“按任意键继续”选项,您将在返回CmdRun方法后执行此操作。控制台窗口仍然会消失,但只有在您说出来时才会消失。

  2. 使用预先存在的控制台。如果始终从命令行运行应用程序,则无需创建新的控制台窗口。相反,使用AttachConsole方法将stdin / stdout附加到已存在的stdin / stdout。

  3. 最好的选择通常是首先尝试AttachConsole(-1)(-1表示ATTACH_PARENT_PROCESS)。如果返回0,那么您的父进程没有控制台,否则您无法附加到它。然后你可以回到AllocConsole,并在关闭后处理它。

    这不是特定于WPF的,只要您尝试在同一个应用程序中混合使用控制台和GUI代码,这就是一个问题。如果您的应用程序是为CUI子系统编译的,通过指定“控制台应用程序”,Windows将为您处理此问题,但默认情况下您不会获得消息队列,并且窗口UI将失败。如果您的应用程序是为GUI子系统编译的,则通过指定“Windows应用程序”,您将获得消息队列,但不会获得控制台处理。让Windows处理GUI部分并手动管理控制台是两个选项中更容易的。