|
|
- using System;
- using System.Collections;
- using System.Runtime.InteropServices;
- using System.IO;
- using System.Text;
- using Microsoft.Win32.SafeHandles;
-
- namespace Windows
- {
-
- class GuiConsole
- {
- public static void CreateConsole()
- {
- if (hasConsole)
- return;
- if (oldOut == IntPtr.Zero)
- oldOut = GetStdHandle( -11 );
- if (! AllocConsole())
- throw new Exception("AllocConsole() failed");
- conOut = CreateFile( "CONOUT$", 0x40000000, 2, IntPtr.Zero, 3, 0, IntPtr.Zero );
- if (! SetStdHandle(-11, conOut))
- throw new Exception("SetStdHandle() failed");
- StreamToConsole();
- hasConsole = true;
- }
- public static void ReleaseConsole()
- {
- if (! hasConsole)
- return;
- if (! CloseHandle(conOut))
- throw new Exception("CloseHandle() failed");
- conOut = IntPtr.Zero;
- if (! FreeConsole())
- throw new Exception("FreeConsole() failed");
- if (! SetStdHandle(-11, oldOut))
- throw new Exception("SetStdHandle() failed");
- StreamToConsole();
- hasConsole = false;
- }
- private static void StreamToConsole()
- {
- Stream cstm = Console.OpenStandardOutput();
- StreamWriter cstw = new StreamWriter( cstm, Encoding.Default );
- cstw.AutoFlush = true;
- Console.SetOut( cstw );
- Console.SetError( cstw );
- }
- private static bool hasConsole = false;
- private static IntPtr conOut;
- private static IntPtr oldOut;
- [DllImport("kernel32.dll", SetLastError=true)]
- private static extern bool AllocConsole();
- [DllImport("kernel32.dll", SetLastError=false)]
- private static extern bool FreeConsole();
- [DllImport("kernel32.dll", SetLastError=true)]
- private static extern IntPtr GetStdHandle( int nStdHandle );
- [DllImport("kernel32.dll", SetLastError=true)]
- private static extern bool SetStdHandle(int nStdHandle, IntPtr hConsoleOutput);
- [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
- private static extern IntPtr CreateFile(
- string fileName,
- int desiredAccess,
- int shareMode,
- IntPtr securityAttributes,
- int creationDisposition,
- int flagsAndAttributes,
- IntPtr templateFile );
- [DllImport("kernel32.dll", ExactSpelling=true, SetLastError=true)]
- private static extern bool CloseHandle(IntPtr handle);
- }
- }
|