Files

96 lines
3.0 KiB
C#
Raw Permalink Normal View History

2026-05-01 00:27:29 +08:00
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace Ink_Canvas.Helpers
{
public static class DebugConsoleManager
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AllocConsole();
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool FreeConsole();
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern bool DeleteMenu(IntPtr hMenu, uint uPosition, uint uFlags);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleTitle(string lpConsoleTitle);
private const int SW_HIDE = 0;
private const int SW_SHOW = 5;
private const uint SC_CLOSE = 0xF060;
private const uint MF_BYCOMMAND = 0x00000000;
private static bool _allocated;
public static bool IsVisible { get; private set; }
public static void Show()
{
try
{
if (!_allocated)
{
if (GetConsoleWindow() == IntPtr.Zero)
{
if (!AllocConsole()) return;
}
_allocated = true;
Console.OutputEncoding = Encoding.UTF8;
SetConsoleTitle("InkCanvasForClass - Debug Console");
// 移除关闭菜单,避免用户点 X 时直接结束进程
var hWnd = GetConsoleWindow();
if (hWnd != IntPtr.Zero)
{
var hMenu = GetSystemMenu(hWnd, false);
if (hMenu != IntPtr.Zero) DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
}
}
else
{
var hWnd = GetConsoleWindow();
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, SW_SHOW);
}
IsVisible = true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[DebugConsoleManager] Show failed: {ex.Message}");
}
}
public static void Hide()
{
try
{
var hWnd = GetConsoleWindow();
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, SW_HIDE);
IsVisible = false;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[DebugConsoleManager] Hide failed: {ex.Message}");
}
}
public static void WriteLine(string line)
{
if (!IsVisible) return;
try { Console.WriteLine(line); }
catch { }
}
}
}