我有一个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));
}
答案 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。