在窗体模式下没有控制台窗口的混合窗口窗体和控制台应用

时间:2015-01-26 11:33:38

标签: c# winforms user-interface console-application

我想创建一个完整的混合应用,同时以Windows FormsConsole Application工作。当我在没有参数的情况下执行它或者不在控制台中执行它时,我希望应用程序打开GUI并离开控制台,就像从控制台调用普通的Windows窗体应用程序一样,但是响应用户并通过它与他交互在通知某些参数时控制台,例如接受条件和条件或确认文件覆盖。这可能吗?

P.S。:我不介意在运行GUI时有控制台输出,但我希望控制台在GUI上运行时保持隐藏状态,而在作为控制台运行时不需要GUI。

注意

how to run a winform from console application?中填充的解决方案(创建表单项目然后更改为控制台)不会参加我,因为它会在从资源管理器调用应用程序时打开控制台窗口。

1 个答案:

答案 0 :(得分:4)

WinForms和Console应用程序之间的区别在于它们以稍微不同的方式编译(参见此question)。控制台应用程序在清单中具有以下标志:

.subsystem 0x0003 // WINDOWS_CUI

WinForms应用程序如下:

.subsystem 0x0002 // WINDOWS_GUI

有很多与此主题相关的问题。例如,请参阅此one。 总的来说,据我所知,没有理想的解决方案,但有些解决方案在某种程度上有效。例如,试试这个:

  1. 创建WinForms应用程序。
  2. 复制此site
  3. 中的代码
  4. 修改WinForms应用程序的 Main 方法,如下所示。
  5. 修改后的 Main 方法:

    [STAThread]
    private static void Main(string[] args)
    {
       if (args.Length == 0)
       {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          Application.Run(new Form1());
       }
       else
       {
          AllocateConsole();
          Console.WriteLine("I'm a console application");
          //...
          FreeConsole();
       }
    }
    

    此解决方案的缺点是:

    1. 无法将控制台应用程序的输出重定向到文件。
    2. 如果从命令行启动,则必须通过按键显式关闭控制台应用程序。
    3. 请阅读我上面提到的文章中的备注和重要内容