WPF工程打开控制台并输出 Output to console from a WPF application
2014-11-24 15:08
381 查看
来自Stackoverflow: http:// href="http://stackoverflow.com/questions/160587/no-output-to-console-from-a-wpf-application" target=_blank>stackoverflow.com/questions/160587/no-output-to-console-from-a-wpf-application
有时候我们需要在WPF项目中 console输出, 例如一些log,或者是实时反馈。 由于项目要求, 用户希望有两种访问方式, 一是双击打开界面(正常情况下),而是其他程序调用(只需要控制台形式的输入与输出)。
开始正题:
从Output type可以看到 Output已经限定。 除非在这里改用 Console Application,要不是不能直接访问 Console的。
Solution:
自己写一个静态类ConsoleManager 实现控制台的show or hide。
有时候我们需要在WPF项目中 console输出, 例如一些log,或者是实时反馈。 由于项目要求, 用户希望有两种访问方式, 一是双击打开界面(正常情况下),而是其他程序调用(只需要控制台形式的输入与输出)。
开始正题:
从Output type可以看到 Output已经限定。 除非在这里改用 Console Application,要不是不能直接访问 Console的。
Solution:
自己写一个静态类ConsoleManager 实现控制台的show or hide。
using System.Security; using System.Runtime.InteropServices; using System.Diagnostics; using System.IO; namespace DualQuad_to_Single_Converter { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { } class Program { public static string InputArgu = ""; /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { if (args.Length > 1) { InputArgu = args[1]; MessageBox.Show(args[1]); } ConsoleManager.Toggle(); System.Console.WriteLine("111"); //DualQuad_to_Single_Converter.App app = new DualQuad_to_Single_Converter.App(); //app.InitializeComponent(); //MainWindow windows = new MainWindow(); //app.MainWindow = windows; //app.Run(); //App.Main(); //return "111"; } } [SuppressUnmanagedCodeSecurity] public static class ConsoleManager { private const string Kernel32_DllName = "kernel32.dll"; [DllImport(Kernel32_DllName)] private static extern bool AllocConsole(); [DllImport(Kernel32_DllName)] private static extern bool FreeConsole(); [DllImport(Kernel32_DllName)] private static extern IntPtr GetConsoleWindow(); [DllImport(Kernel32_DllName)] private static extern int GetConsoleOutputCP(); public static bool HasConsole { get { return GetConsoleWindow() != IntPtr.Zero; } } /// <summary> /// Creates a new console instance if the process is not attached to a console already. /// </summary> public static void Show() { //#if DEBUG if (!HasConsole) { AllocConsole(); InvalidateOutAndError(); } //#endif } /// <summary> /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. /// </summary> public static void Hide() { //#if DEBUG if (HasConsole) { SetOutAndErrorNull(); FreeConsole(); } //#endif } public static void Toggle() { if (HasConsole) { Hide(); } else { Show(); } } static void InvalidateOutAndError() { Type type = typeof(System.Console); System.Reflection.FieldInfo _out = type.GetField("_out", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.FieldInfo _error = type.GetField("_error", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); Debug.Assert(_out != null); Debug.Assert(_error != null); Debug.Assert(_InitializeStdOutError != null); _out.SetValue(null, null); _error.SetValue(null, null); _InitializeStdOutError.Invoke(null, new object[] { true }); } static void SetOutAndErrorNull() { Console.SetOut(TextWriter.Null); Console.SetError(TextWriter.Null); } static void SetOut(string A) { } } }重写入口函数Main(). 实现控制台输入, 如果不需要可直接忽略
相关文章推荐
- 控制台输出水平(Console output levels)
- vs2010 建立gui 工程后打开console控制台方法
- R: 控制台的清理与输出内容的保存 (Clear Console & Save Console Output)
- Hive console log output 控制台输出日志
- Strings and Console Output(字符串与控制台输出)
- MFC|Console Output from a GUI program(MFC调用cout输出)
- 如何在win32控制台加入MFC对话框(Adding Windows To Your Console Application)
- VisualStudio一打开工程就崩溃-重打开output显示We were unable to automatically populate your Visual Studio Online accounts.
- Eclipse的控制台无信息输出,总是提示:No Consoles to display at this time
- FillConsoleOutputAttribute 函数--指定区域填充控制台输出属性
- How to launch Windows applications (Notepad) / Call Batch files from a C#/.NET console application.
- *在Win32应用程序中使用Console控制台输出信息(原)
- Unable to build project output group 'Content Files from ThisProjectName (Active)’
- php在eclipse的控制台console输出调试信息功能实现
- WinForm程序中使用控制台(console)作为输出窗口
- Window下Qt中用qDebug()输出调试信息到Console控制台的设置方法
- 在Win32应用程序中用Console控制台输出信息
- How to call the EnumJobs function from a Visual Basic .NET application
- How To Read a File From Your Application Bundle
- EVC移植问题和编译wince console Application(EVC 控制台程序)的方法