|
|
- using System;
- using System.IO;
- using System.Runtime.InteropServices;
- using System.Text;
- using UnityEngine;
-
- namespace Photon.Bolt
- {
- public static class ConsoleWriter
- {
- #if UNITY_STANDALONE_WIN
- static class PInvoke
- {
- public const int STD_OUTPUT_HANDLE = -11;
-
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern bool AttachConsole(uint dwProcessId);
-
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern bool AllocConsole();
-
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern bool FreeConsole();
-
- [DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
- public static extern IntPtr GetStdHandle(int nStdHandle);
-
- [DllImport("kernel32.dll")]
- public static extern bool SetConsoleTitle(string lpConsoleTitle);
- }
-
- static TextWriter realOut;
- #endif
-
- public static void Open()
- {
- #if UNITY_STANDALONE_WIN
- if (realOut == null)
- {
- realOut = Console.Out;
- }
-
- var hasConsole = PInvoke.AttachConsole(0x0ffffffff);
- if (hasConsole == false)
- {
- PInvoke.AllocConsole();
- }
-
- try
- {
- // grab handle ptr
- var outHandlePtr = PInvoke.GetStdHandle(PInvoke.STD_OUTPUT_HANDLE);
-
- // we can then create a filestream from this handle
- #pragma warning disable 0618
- var fileStream = new FileStream(outHandlePtr, FileAccess.Write);
- #pragma warning restore 0618
-
- // and then create a new stream writer (using ASCII)
- var stdOut = new StreamWriter(fileStream, Encoding.ASCII)
- {
- AutoFlush = true
- };
-
- // and force unity to use this
- Console.SetOut(stdOut);
- }
- catch (Exception e)
- {
- Debug.Log(e);
- }
- #endif
- }
-
- public static void Close()
- {
- #if UNITY_STANDALONE_WIN
- PInvoke.FreeConsole();
-
- Console.SetOut(realOut);
- realOut = null;
- #endif
- }
- }
- }
|