add:debug功能
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) },
|
||||||
|
|||||||
Reference in New Issue
Block a user