add:debug功能

This commit is contained in:
2026-05-01 00:27:29 +08:00
parent b0aff1e378
commit 4d8fbef455
8 changed files with 185 additions and 2 deletions
+1 -1
View File
@@ -261,7 +261,7 @@ namespace Ink_Canvas
Current.MainWindow.SourceInitialized -= MainWindow_SourceInitialized; Current.MainWindow.SourceInitialized -= MainWindow_SourceInitialized;
Current.MainWindow.SourceInitialized += MainWindow_SourceInitialized; Current.MainWindow.SourceInitialized += MainWindow_SourceInitialized;
} }
catch (Exception ex) catch (Exception)
{ {
} }
} }
+96
View File
@@ -0,0 +1,96 @@
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 { }
}
}
}
+1
View File
@@ -83,6 +83,7 @@ namespace Ink_Canvas.Helpers
} }
} }
string logLine = string.Format("{0} [T{1}] [{2}] [{3}] {4}", DateTime.Now.ToString("O"), threadId, strLogType, callerInfo, str); string logLine = string.Format("{0} [T{1}] [{2}] [{3}] {4}", DateTime.Now.ToString("O"), threadId, strLogType, callerInfo, str);
DebugConsoleManager.WriteLine(logLine);
ProcessProtectionManager.WithWriteAccess(file, () => ProcessProtectionManager.WithWriteAccess(file, () =>
{ {
using (StreamWriter sw = new StreamWriter(file, true)) using (StreamWriter sw = new StreamWriter(file, true))
+6
View File
@@ -1180,6 +1180,12 @@ namespace Ink_Canvas
LoadSettings(true); LoadSettings(true);
ApplyLanguageFromSettings(); ApplyLanguageFromSettings();
// 启动时根据设置恢复调试控制台显示状态
if (Settings?.Advanced != null && Settings.Advanced.IsDebugConsoleEnabled)
{
Helpers.DebugConsoleManager.Show();
}
_ = TelemetryUploader.UploadTelemetryIfNeededAsync(); _ = TelemetryUploader.UploadTelemetryIfNeededAsync();
LoadCustomBackgroundColor(); LoadCustomBackgroundColor();
+3
View File
@@ -684,6 +684,9 @@ namespace Ink_Canvas
[JsonProperty("isSaveLogByDate")] [JsonProperty("isSaveLogByDate")]
public bool IsSaveLogByDate { get; set; } = true; public bool IsSaveLogByDate { get; set; } = true;
[JsonProperty("isDebugConsoleEnabled")]
public bool IsDebugConsoleEnabled { get; set; } = false;
[JsonProperty("isEnableFullScreenHelper")] [JsonProperty("isEnableFullScreenHelper")]
public bool IsEnableFullScreenHelper { get; set; } public bool IsEnableFullScreenHelper { get; set; }
@@ -0,0 +1,43 @@
<ui:Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.DebugPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:Ink_Canvas.Controls;assembly=InkCanvas.Controls"
mc:Ignorable="d"
Title="Debug">
<ScrollViewer PanningMode="VerticalFirst">
<Grid Margin="59,0,59,0">
<FrameworkElement.Resources>
<sys:Double x:Key="SettingsCardSpacing">4</sys:Double>
<Style x:Key="SettingsSectionHeaderTextBlockStyle"
BasedOn="{StaticResource BodyStrongTextBlockStyle}"
TargetType="TextBlock">
<Style.Setters>
<Setter Property="Margin" Value="1,30,0,6" />
</Style.Setters>
</Style>
</FrameworkElement.Resources>
<ikw:SimpleStackPanel MaxWidth="1000"
HorizontalAlignment="Stretch"
Spacing="{StaticResource SettingsCardSpacing}">
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
Text="Debug" />
<controls:LabeledSettingsCard x:Name="ToggleSwitchDebugConsole"
Header="显示调试窗口"
Description="显示一个独立的控制台窗口,用于实时输出日志(开启后立即生效;关闭设置中的“启用日志记录”将不会输出内容)。"
Icon="{x:Static ui:SegoeFluentIcons.DeveloperTools}"
IsOn="False"
Toggled="ToggleSwitchDebugConsole_Toggled"/>
</ikw:SimpleStackPanel>
</Grid>
</ScrollViewer>
</ui:Page>
@@ -0,0 +1,34 @@
using Ink_Canvas.Helpers;
using Ink_Canvas.Windows.SettingsViews.Helpers;
using System.Windows;
using Page = iNKORE.UI.WPF.Modern.Controls.Page;
namespace Ink_Canvas.Windows.SettingsViews.Pages
{
public partial class DebugPage : Page
{
private bool _isLoaded;
public DebugPage()
{
InitializeComponent();
Loaded += (s, e) =>
{
ToggleSwitchDebugConsole.IsOn = SettingsManager.Settings.Advanced.IsDebugConsoleEnabled;
_isLoaded = true;
};
Unloaded += (s, e) => _isLoaded = false;
}
private void ToggleSwitchDebugConsole_Toggled(object sender, RoutedEventArgs e)
{
if (!_isLoaded) return;
bool isOn = ToggleSwitchDebugConsole.IsOn;
SettingsManager.Settings.Advanced.IsDebugConsoleEnabled = isOn;
SettingsManager.SaveSettingsToFile();
if (isOn) DebugConsoleManager.Show();
else DebugConsoleManager.Hide();
}
}
}
@@ -50,7 +50,7 @@ namespace Ink_Canvas.Windows.SettingsViews
{ "RandomDrawPage", typeof(RandomDrawPage) }, { "RandomDrawPage", typeof(RandomDrawPage) },
{ "CanvasPage", typeof(CanvasPage) }, { "CanvasPage", typeof(CanvasPage) },
{ "InkRecognitionPage", typeof(InkRecognitionPage) }, { "InkRecognitionPage", typeof(InkRecognitionPage) },
{ "DebugPage", typeof(IconographyPage) }, { "DebugPage", typeof(DebugPage) },
{ "AboutPage", typeof(AboutPage) }, { "AboutPage", typeof(AboutPage) },
{ "Settings", typeof(SettingsPage) }, { "Settings", typeof(SettingsPage) },
{ "PluginPage", typeof(PluginPage) }, { "PluginPage", typeof(PluginPage) },