WinForm / 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)); }
也许我一直在做错了,但我总是做这样的混合动力:
[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应用程序而不显示主窗体(如果在命令行上传递某个参数)来实现此操作,而不是这种iffy方法。
由于控制台应用程序不需要消息循环,因此在控制台模式下调用时不会调用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)如果我想在窗口模式下运行它时隐藏控制台,我将丢失阻止打印。
上面的方法是有效的,但如果您尝试调试exception,它将不允许您写入控制台,这令人抓狂。 要从Win Forms应用程序写入控制台,您需要应用此处描述的代码: http : //www.codeissue.com/issues/i24e1ef8e5a93b4/run-windows-form-application-as-console-app-c 。