OutputConsole.WriteLinefromWPFWindowsApplicationtoActualConsole背景:我正在尝试将命令行添加到现有的WPFWindows应用程序和批处理功能。当我在启动时检测到一些选项时,我会抑制窗口出现,进行一些处理并立即退出。现在,由于没有UI,我想将一些消息输出到stdout/stderr。考虑以下代码:系统.Threading.Thread.Sleep(1000);Console.WriteLine("停止");关机(0);当我从命令行运行时,我希望得到以下输出:StartStopbutinstead:C:test>WpfConsoleTest.exeC:test>但是,您可以重定向输出:C:test>WpfConsoleTest.exe>out.txtC:test>typeout.txtStartStop不幸的是,重定向到CON不起作用:C:test>WpfConsoleTest.exe>CONC:test>另一个问题是WpfConsoleTest.exe启动后立即退出。所以:C:test>WpfConsoleTest.exe>out.txt&typeout.txtC:test>But:C:test>WpfConsoleTest.exe>out.txt&pinglocalhost>nul&typeout.txtStartStopSofar的我能想出的最佳解决方案是使用start/B/wait:C:test>start/B/waitWpfConsoleTest.exe>out.txt&typeout.txtStartStop这种方法基本上没问题-如果你把Wrapped放入蝙蝠,你可以保留错误代码等。一个巨大的失败是你在应用程序结束后得到输出,即你无法跟踪进度,你必须等待正在进行的任何事情完成。所以,我的问题是:如何从WPFWindows应用程序输出到父控制台?另外,为什么从WPF中获取stdout/stderr如此困难?我知道我可以在项目设置中将应用程序类型更改为控制台应用程序,但这有一个恼人的副作用——控制台窗口始终可见,即使您只是双击exe。该解决方案也不会这样做,因为即使应用程序是从cmd运行的,它也会创建一个新的控制台。编辑:澄清一下,我希望我的应用程序输出到一个现有的控制台(如果有的话)并且如果它丢失则不创建一个新的控制台。经过一番挖掘,我找到了答案。现在的代码是:protectedoverridevoidOnStartup(StartupEventArgse){AttachConsole(-1);控制台.WriteLine("开始");系统.Threading.Thread.Sleep(1000);Console.WriteLine("停止");关机(0);}}}直接调用exe仍然有一个令人讨厌的副作用,不像立即返回的调用与:C:test>WpfConsoleTest.exeC:test>StartStop^^^^光标将停留在这里等待用户按回车!解决方案是重新启动:C:test>start/waitWpfConsoleTest.exeStartStop感谢您的输入!我过去所做的是使它成为一个控制台应用程序,并在我显示WPF窗口后调用P/Invoke来隐藏应用程序的关联控制台窗口://addedusingstatementspercomments...usingSystem.Diagnostics;使用System.Runtime.InteropServices;内部密封类Win32{[DllImport("user32.dll")]staticexternboolShowWindow(IntPtrhWnd,intnCmdShow);publicstaticvoidHideConsoleWindow(){IntPtrhWnd=Process.GetCurrentProcess().MainWindowHandle;如果(hWnd!=IntPtr.Zero){ShowWindow(hWnd,0);//0=SW_HIDE}}}默认情况下,WPF应用程序没有控制台,但您可以轻松地为它创建一个控制台,然后就像在控制台应用程序中一样,我以前使用过这个帮助程序类:publicclassConsoleHelper{//////为当前进程分配一个新的控制台。///[DllImport("kernel32.dll")]publicstaticexternBooleanAllocConsole();//////释放控制台。///[DllImport("kernel32.dll")]publicstaticexternBooleanFreeConsole();}要在您的示例中使用它,您应该能够执行以下操作:namespaceWpfConsoleTest{publicpartialclassApp:Application{Console.WriteLine("开始");系统.Threading.Thread.Sleep(1000);Console.WriteLine("停止");ConsoleHelper.FreeConsole();关机(0);现在,如果您从命令行运行它,您应该会看到“Start”和“Stop”写入控制台。在项目属性中,您可以将项目类型从Windows应用程序更改为控制台应用程序,据我所知,唯一的区别是您可以在应用程序的整个生命周期中使用控制台。我没有尝试使用WPF。如果您想打开和关闭控制台,您应该使用Alloc/FreeConsole,但更改项目类型通常更简单。以上就是C#学习教程:从WPFWindows应用程序输出Console.WriteLine到实际控制台的全部内容分享,如果对你有用还需要详细了解C#学习教程,希望大家多多包涵更多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
