using System;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using System.Windows.Forms;
|
|
using amecs;
|
|
|
|
namespace Ameliorated.ConsoleUtils
|
|
{
|
|
public static partial class ConsoleTUI
|
|
{
|
|
private const int MF_BYCOMMAND = 0x00000000;
|
|
private const int SC_CLOSE = 0xF060;
|
|
private const int SC_MINIMIZE = 0xF020;
|
|
private const int SC_MAXIMIZE = 0xF030;
|
|
private const int SC_SIZE = 0xF000; //resize
|
|
|
|
private const uint CHECK_QUICK_EDIT = 0x0040;
|
|
private const int ENABLE_QUICK_EDIT = 0x40 | 0x80;
|
|
|
|
// STD_INPUT_HANDLE (DWORD): -10 is the standard input device.
|
|
private const int STD_INPUT_HANDLE = -10;
|
|
private static string PreviousTitle;
|
|
private static int PreviousBufferHeight = 26;
|
|
private static int PreviousBufferWidth = 80;
|
|
private static int PreviousSizeHeight = 26;
|
|
private static int PreviousSizeWidth = 80;
|
|
|
|
private static bool IsInitialized;
|
|
private static int InitializedWidth = 80;
|
|
|
|
public static void ShowErrorBox(string message, string caption)
|
|
{
|
|
NativeWindow window = new NativeWindow();
|
|
window.AssignHandle(Process.GetCurrentProcess().MainWindowHandle);
|
|
MessageBox.Show(window, message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
|
|
public enum BackdropType
|
|
{
|
|
None = 1,
|
|
Mica = 2,
|
|
Acrylic = 3,
|
|
Tabbed = 4
|
|
}
|
|
|
|
[DllImport("dwmapi.dll")]
|
|
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int pvAttribute, int cbAttribute);
|
|
|
|
public static void Initialize(string title, int width = 80, int height = 26, bool resize = false, bool quickedit = false)
|
|
{
|
|
if (width < 2) throw new ArgumentException("Width must be greater than one.");
|
|
|
|
IsInitialized = true;
|
|
PreviousSizeHeight = Console.WindowHeight;
|
|
PreviousSizeWidth = Console.WindowWidth;
|
|
PreviousBufferHeight = Console.BufferHeight;
|
|
PreviousBufferWidth = Console.BufferWidth;
|
|
|
|
Console.SetWindowSize(width, height);
|
|
Console.SetBufferSize(width, height);
|
|
Console.SetWindowSize(width, height);
|
|
|
|
InitializedWidth = width;
|
|
|
|
Console.Clear();
|
|
|
|
Console.CursorVisible = false;
|
|
|
|
PreviousTitle = Console.Title;
|
|
Console.Title = title;
|
|
|
|
try
|
|
{
|
|
if ((Console.CursorLeft == 0 && Console.CursorTop == 0) || ParentProcess.ProcessName.Equals("Explorer", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
var bd = (int)BackdropType.Mica;
|
|
var trueA = 0x01;
|
|
|
|
if (Globals.WinVer >= 22523)
|
|
{
|
|
var handle = Process.GetCurrentProcess().MainWindowHandle;
|
|
DwmSetWindowAttribute(handle, 38, ref bd, Marshal.SizeOf<int>());
|
|
DwmSetWindowAttribute(handle, 20, ref trueA, Marshal.SizeOf<int>());
|
|
}
|
|
}
|
|
} catch (Exception e) { }
|
|
|
|
if (!resize)
|
|
try
|
|
{
|
|
DisableResize();
|
|
} catch (Exception e)
|
|
{
|
|
ConsoleUtils.WriteError("Error disabling window resize - " + e.Message);
|
|
}
|
|
|
|
if (!quickedit)
|
|
try
|
|
{
|
|
DisableQuickEdit();
|
|
} catch (Exception e)
|
|
{
|
|
ConsoleUtils.WriteError("Error disabling quickedit - " + e.Message);
|
|
}
|
|
}
|
|
|
|
public static void Close()
|
|
{
|
|
if (!IsInitialized) throw new MethodAccessException("Console TUI must be initialized before calling other TUI functions.");
|
|
IsInitialized = false;
|
|
|
|
var parent = ParentProcess.ProcessName;
|
|
if (parent.Equals("Explorer", StringComparison.CurrentCultureIgnoreCase)) return;
|
|
|
|
try
|
|
{
|
|
EnableResize();
|
|
} catch (Exception e)
|
|
{
|
|
ConsoleUtils.WriteError("Error enabling window resize - " + e.Message);
|
|
}
|
|
|
|
try
|
|
{
|
|
EnableQuickEdit();
|
|
} catch (Exception e)
|
|
{
|
|
ConsoleUtils.WriteError("Error enabling quickedit - " + e.Message);
|
|
}
|
|
|
|
Console.CursorVisible = true;
|
|
Console.Clear();
|
|
Console.Title = PreviousTitle;
|
|
|
|
Console.SetWindowSize(PreviousSizeWidth, PreviousSizeHeight);
|
|
Console.SetBufferSize(PreviousBufferWidth, PreviousBufferHeight);
|
|
}
|
|
|
|
[DllImport("user32.dll")]
|
|
public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
|
|
|
|
[DllImport("user32.dll")]
|
|
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
|
|
|
|
[DllImport("kernel32.dll", ExactSpelling = true)]
|
|
private static extern IntPtr GetConsoleWindow();
|
|
|
|
private static void DisableResize()
|
|
{
|
|
var handle = GetConsoleWindow();
|
|
var sysMenu = GetSystemMenu(handle, false);
|
|
|
|
if (handle != IntPtr.Zero)
|
|
{
|
|
//DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND);
|
|
//DeleteMenu(sysMenu, SC_MINIMIZE, MF_BYCOMMAND);
|
|
DeleteMenu(sysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
|
|
DeleteMenu(sysMenu, SC_SIZE, MF_BYCOMMAND); //resize
|
|
}
|
|
}
|
|
|
|
private static void EnableResize()
|
|
{
|
|
var handle = GetConsoleWindow();
|
|
GetSystemMenu(handle, true);
|
|
}
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
private static extern IntPtr GetStdHandle(int nStdHandle);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
|
|
|
|
private static void DisableQuickEdit()
|
|
{
|
|
var consoleHandle = GetStdHandle(STD_INPUT_HANDLE);
|
|
|
|
// get current console mode
|
|
uint consoleMode;
|
|
GetConsoleMode(consoleHandle, out consoleMode);
|
|
|
|
// set the new mode
|
|
SetConsoleMode(consoleHandle, consoleMode &= ~CHECK_QUICK_EDIT);
|
|
}
|
|
|
|
private static void EnableQuickEdit()
|
|
{
|
|
var consoleHandle = GetStdHandle(STD_INPUT_HANDLE);
|
|
|
|
// get current console mode
|
|
uint consoleMode;
|
|
GetConsoleMode(consoleHandle, out consoleMode);
|
|
|
|
// set the new mode
|
|
SetConsoleMode(consoleHandle, consoleMode | ENABLE_QUICK_EDIT);
|
|
}
|
|
}
|
|
}
|