WinForm / Console混合应用程序中的行为

时间:2011-10-12 16:32:42

标签: c# .net winforms console

我有一个WinForm项目,如果将某些参数传递给它,我希望它可用作控制台应用程序。使用我从这里读到的一些技巧,我使用以下代码来完成这项工作。

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

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);

...

if (!AttachConsole(-1))
{
   AllocConsole();
}

这有效,但有一个恼人的副作用 - 所有输出似乎都是从后台线程生成的。当我从命令提示符运行程序时,输出会在显示输出之前显示下一个提示。

我将项目属性的输出类型设置为控制台应用程序,它修复了这个问题,但现在总是显示一个控制台窗口 - 即使它是在'WinForm模式'下运行。

有没有办法充分利用控制台的行为,就像程序是当前进程,并且当程序显示WinForm时不显示控制台窗口?

更新: 对于不澄清这一点我表示歉意。我在Program.cs中在控制台和WinForm模式之间切换,如下所示:

// nowin is a bool that is set based on a parameter
if (nowin)
{
    if (!AttachConsole(-1))
    {
        AllocConsole();
    }
    //... Console mode code here...
}
else
{
    // run in window
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1(argDict));
}

4 个答案:

答案 0 :(得分:6)

也许我做错了但我总是做这样的混合动力车:

[STAThread]
public static int Main(string[] args)
{
   if (args.Length > 0)
   {
      // run console code here
   }
   else
   {
      // start up the win form app
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new MainForm());
   }

   return 0;
}

答案 1 :(得分:2)

除了这个iffy方法之外,您可以通过创建一个winforms应用程序来完成此操作,如果在命令行上传递了某个参数,则不会显示主窗体。

由于控制台应用程序不需要消息循环,因此在控制台模式下调用时不会调用Application.Run()。

所以你的Main()会是这样的:

    static void Main(params string[] args)
    {
        if (args.Length > 0 && args[0] == "consolemode")
        {
            // do stuff 
        }
        else
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

我没有试过这个,但我认为它会起作用。

答案 2 :(得分:1)

看起来没有办法解决它: 1)如果我希望控制台模式下的输出表现得像专用的控制台应用程序,控制台窗口必须始终在那里。 2)如果我想在窗口模式下运行它时隐藏控制台,我将丢失阻塞打印。

答案 3 :(得分:0)

以上方法可行,但如果您尝试调试异常,它不会允许您写入控制台,这令人抓狂。要从Win Forms应用程序写入控制台,您需要应用此处描述的代码:http://www.codeissue.com/issues/i24e1ef8e5a93b4/run-windows-form-application-as-console-app-c