【问题标题】:Is it possible to have a WPF application print console output?是否可以让 WPF 应用程序打印控制台输出?
【发布时间】:2015-08-13 03:03:15
【问题描述】:

我有一个简单的 WPF 应用程序。在正常使用情况下,App.xaml 将启动 MainWindow.xaml。但我想对其进行设置,以便如果使用特殊的命令行参数调用它,它将作为控制台应用程序运行。

我的 App.xaml.cs 文件大致如下所示:

using System;

namespace MyProject
{
    public partial class App : Application
    {
        public void App_OnStartup(object sender, StartupEventArgs e)
        {
            if (e.Args.Length == 1 && e.Args[0].Equals("/console"))
            {
                Console.WriteLine("this is a test");
                Environment.Exit(0);
            }
            else
            {
                var mainWindow = new MainWindow();
                mainWindow.Show();
            }
        }
    }
}

我希望当我从命令行运行MyProject.exe /console 时,它会打印字符串“这是一个测试”。但现在它不打印任何东西。我怎样才能让它工作?

【问题讨论】:

    标签: c# wpf console


    【解决方案1】:

    为此我们有专门的课程:

    internal static class ConsoleAllocator
    {
        [DllImport(@"kernel32.dll", SetLastError = true)]
        static extern bool AllocConsole();
    
        [DllImport(@"kernel32.dll")]
        static extern IntPtr GetConsoleWindow();
    
        [DllImport(@"user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
        const int SwHide = 0;
        const int SwShow = 5;
    
    
        public static void ShowConsoleWindow()
        {
            var handle = GetConsoleWindow();
    
            if (handle == IntPtr.Zero)
            {
                AllocConsole();
            }
            else
            {
                ShowWindow(handle, SwShow);
            }
        }
    
        public static void HideConsoleWindow()
        {
            var handle = GetConsoleWindow();
    
            ShowWindow(handle, SwHide);
        }
    }
    

    只需拨打ConsoleAllocator.ShowConsoleWindow(),然后写入控制台

    【讨论】:

      【解决方案2】:

      如果您不想创建 Application 对象,那么您应该创建一个包含 Main 入口点的单独类:

      class Startup
      {
          [STAThreadAttribute]
          public static int Main(string[] args)
          {
              if (args.Length == 0)
              {
                  // run windowed
                  App app = new App();
                  app.InitializeComponent();
                  app.Run();
              }
              else
              {
                  // run console
                  ConsoleManager.Show();
                  Console.WriteLine("Press any key to exit...");
                  Console.ReadKey();
              }
      
              return 0;
          }
      }
      

      您还需要进入应用程序设置并将“启动对象”更改为“YourProjectNamespace.Startup”,有关详细信息,请参阅this article

      我调用的控制台函数来自this question 的已接受答案,它显示了如何利用标准控制台流。

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 2011-09-05
        • 2010-09-14
        • 2011-08-26
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        相关资源
        最近更新 更多