c# - 在 WPF 项目中实现命令行运行

标签 c# wpf

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

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

最佳答案

当您使用 AllocConsole 创建一个新的控制台窗口时,它只会在您的进程仍处于事件状态时停留。为防止这种情况,您有两种选择:

  1. 在用户提供一些输入之前不要真正终止您的进程。这是你的陈词滥调“按任意键继续”选项,你会在 CmdRun 方法返回后执行此操作。控制台窗口仍然会消失,但只有在您告诉它时才会消失。

  2. 使用预先存在的控制台。如果您总是从命令行运行应用程序,则不需要创建新的控制台窗口。相反,使用 AttachConsole 方法将您的标准输入/标准输出附加到已经存在的标准输入/标准输出。

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

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

关于c# - 在 WPF 项目中实现命令行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222138/

相关文章:

c# - 无法从 "method group"转换为 "string"

c# - 如何使用 sqlite-net 在适用于所有数据库模型的父类中实现插入、更新和删除?

c# - WCF 服务可测试性和依赖注入(inject)

javascript - ASP DropDownList 样式设计困难

c# - 在类中定义算术运算

c# - 向 FlowDocument 文档添加页脚

wpf - Schedular.Dispatcher 在哪里?

wpf - 我总是需要为日期格式编写转换器吗?

c# - 为什么用CollectionView过滤DataTable时会出错?

wpf - 如何为多个 View 重用 Entity Framework 数据源 WPF EF MVVM