C# 控制台-没有控制台但有 winforms 的应用程序

C# Console-Application with no console but winforms

我们有一个 WinForms 应用程序。它接受启动参数并且可以使用命令行执行某些没有UI的工作。

现在,我们还需要一些控制台输出,例如使用 application.exe /help

我们现在面临的问题是:如何以一种“美好”的方式将两个世界结合在一起:

  1. 将输出类型设置为“Windows 应用程序”时,所有 UI 都可以正常工作,但 Console.WriteLine() 使用时不显示结果命令.

  2. 当将输出类型设置为“控制台”时,通常这两种方法都有效,但是:应用程序(可以说是在 UI-模式下使用时)会引发一个控制台 window,在应用程序终止之前一直保持打开状态。

有没有办法绕过控制台的可见性-window?

在现实世界中,我可以使用以下三种方法之一找到应用程序 - 但我都不喜欢其中任何一种:

  1. 在 UI 模式下 运行 时让控制台 window 打开,谁在乎?

  2. 使用user32.dll隐藏window(它仍然闪烁,不过)

  3. 从命令行使用时,使用 Windows-Application 作为输出类型并将控制台输出显示为“消息框”。

我找到了解决办法,感谢@Luaan 的评论:

我现在正在使用输出类型 Windows 应用程序(因此,没有控制台 window)- 但只需将控制台注册到应用程序“父”控制台即可。

现在的行为符合预期:

  • 正常启动期间不显示控制台。

  • 在现有控制台 window (ps / cmd) 中使用时,会打印输出,因为从技术上讲,控制台就是 parent-console申请。

    public class GUIConsoleWriter
    {
      [System.Runtime.InteropServices.DllImport("kernel32.dll")]
      private static extern bool AttachConsole(int dwProcessId);
      private const int ATTACH_PARENT_PROCESS = -1;
    
      public static void RegisterGUIConsoleWriter()
      {
          AttachConsole(ATTACH_PARENT_PROCESS);
      }
    } 
    

然后,Main() 中的第一行:

  static void Main(String[] args)
  {
        GUIConsoleWriter.RegisterGUIConsoleWriter();
  }

现在,使用常规 Console.WriteLine() 就可以了。 Ofc。这仅限于编写输出,但对于我的项目范围来说已经足够了,因为输入必须带有参数,没有交互式 console-options.

当另一个应用程序需要以编程方式获取输出时,您可以。不能 myApp.exe /doSomething 但需要 cmd /C myApp.exe /doSomething 因为应用程序本身没有控制台。

并且您必须在提供输出后手动注意“退出”您的应用程序,否则该过程将不会 return。