WinForm/Console混合应用程序中的行为
本文关键字:应用程序 Console 混合 WinForm | 更新日期: 2023-09-27 18:11:09
我有一个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));
}
也许我做错了,但是我总是做这样的混合:
[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;
}
您可以通过创建一个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());
}
}
我还没有试过,但我认为它会工作。
看起来没有办法:1)如果我希望控制台模式的输出表现得像一个专用的控制台应用程序,那么控制台窗口必须始终存在。2)如果我想隐藏控制台时,我运行在窗口模式,我将失去阻塞打印。
上面的方法可以工作,但它不允许您写入控制台,如果您试图调试异常,这是令人恼火的。要从Win Forms应用程序写入控制台,您需要应用下面描述的代码:http://www.codeissue.com/issues/i24e1ef8e5a93b4/run-windows-form-application-as-console-app-c.