Script for automating a large assortment of AME related actions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
6.8 KiB

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);
}
}
}