| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- using System;
- using System.Diagnostics;
- using System.IO;
- using System.Runtime.InteropServices;
- using System.Security;
- namespace GeekDesk.Util
- {
- [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);
- }
- }
- }
|