From c5b7c19d274f3b66a471cd66e886c13320fa10de Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:11:07 +0800 Subject: [PATCH 1/8] Revert "Centralize startup shortcut handling, add legacy shortcut support and error logging" This reverts commit 8867f69c617b7dab02d8030917bb3cf1ea239a65. --- .../Helpers/ProcessProtectionManager.cs | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/Ink Canvas/Helpers/ProcessProtectionManager.cs b/Ink Canvas/Helpers/ProcessProtectionManager.cs index 2e4a7ce6..3899f5a5 100644 --- a/Ink Canvas/Helpers/ProcessProtectionManager.cs +++ b/Ink Canvas/Helpers/ProcessProtectionManager.cs @@ -23,6 +23,20 @@ internal static class ProcessProtectionManager "AutoUpdate" }; + private static readonly string DebugTag = "[ProcessProtectionManager]"; + + private static void WriteDebugLog(string message, Exception ex = null) + { + if (ex == null) + { + System.Diagnostics.Debug.WriteLine($"{DebugTag} {message}"); + return; + } + + System.Diagnostics.Debug.WriteLine($"{DebugTag} {message}: {ex.Message}"); + } + + public static bool Enabled { get { lock (_lock) return _enabled; } @@ -70,7 +84,10 @@ public static void SetEnabled(bool enabled) { LogHelper.WriteLogToFile($"ProcessProtectionManager.SetEnabled 后台执行失败: {ex.Message}", LogHelper.LogType.Warning); } - catch { } + catch (Exception logEx) + { + WriteDebugLog("写入告警日志失败", logEx); + } } }); } @@ -104,7 +121,7 @@ public static void WithWriteAccess(string targetPath, Action action) } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"[ProcessProtectionManager] 写日志失败: {ex.Message}"); + WriteDebugLog("写日志失败", ex); } var normPath = NormalizePath(targetPath); @@ -139,14 +156,14 @@ public static void WithWriteAccess(string targetPath, Action action) { foreach (var kv in fallbackFiles) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } } if (fallbackDirs != null) { foreach (var kv in fallbackDirs) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } } @@ -161,7 +178,7 @@ public static void WithWriteAccess(string targetPath, Action action) Enable(rescanRoot: false, rescanDirs: dirsChain); } } - catch { } + catch (Exception ex) { WriteDebugLog("降级路径恢复保护失败", ex); } } return; } @@ -199,14 +216,14 @@ public static void WithWriteAccess(string targetPath, Action action) { foreach (var kv in releasedFiles) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } } if (releasedDirs != null) { foreach (var kv in releasedDirs) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } } @@ -221,8 +238,9 @@ public static void WithWriteAccess(string targetPath, Action action) Enable(rescanRoot: false, rescanDirs: dirsToToggle); } } - catch + catch (Exception ex) { + WriteDebugLog("恢复目录/文件保护失败", ex); } Interlocked.Exchange(ref _writeGate, 0); @@ -305,8 +323,9 @@ private static void Enable(bool rescanRoot, IEnumerable rescanDirs) } } } - catch + catch (Exception ex) { + WriteDebugLog("启用保护失败", ex); } } @@ -323,13 +342,13 @@ private static void Disable() { foreach (var kv in _lockedFiles) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } _lockedFiles.Clear(); foreach (var kv in _lockedDirs) { - try { kv.Value.Dispose(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } + try { kv.Value.Dispose(); } catch (Exception ex) { WriteDebugLog("释放文件锁失败", ex); } } _lockedDirs.Clear(); } @@ -356,8 +375,9 @@ private static void LockDirectoryRecursive(string root) } } } - catch + catch (Exception ex) { + WriteDebugLog("遍历锁定对象时发生异常", ex); } } @@ -388,8 +408,9 @@ private static void LockFilesRecursive(string root) } } } - catch + catch (Exception ex) { + WriteDebugLog("遍历锁定对象时发生异常", ex); } } @@ -408,8 +429,9 @@ private static void LockFile(string filePath) var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); _lockedFiles[filePath] = fs; } - catch + catch (Exception ex) { + WriteDebugLog("锁定文件失败", ex); } } } @@ -432,8 +454,9 @@ private static void LockDirectory(string dirPath) _lockedDirs[dirPath] = handle; } } - catch + catch (Exception ex) { + WriteDebugLog("锁定目录失败", ex); } } } @@ -450,8 +473,9 @@ private static string NormalizePath(string p) if (string.IsNullOrWhiteSpace(p)) return p; return Path.GetFullPath(p.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)); } - catch + catch (Exception ex) { + WriteDebugLog("路径规范化失败", ex); return p; } } @@ -478,8 +502,9 @@ private static List GetDirChainToRoot(string path) dir = NormalizePath(Path.GetDirectoryName(dir)); } } - catch + catch (Exception ex) { + WriteDebugLog("构建目录链失败", ex); } return list; } @@ -505,8 +530,9 @@ private static bool IsExcludedPath(string path) } } } - catch + catch (Exception ex) { + WriteDebugLog("排除路径检查失败", ex); } return false; } From f22ff781a433cd5f491d876508b4d543ace5e1e0 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:24 +0800 Subject: [PATCH 2/8] Add warning logs for notification helper failures --- Ink Canvas/Helpers/WindowsNotificationHelper.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/Helpers/WindowsNotificationHelper.cs b/Ink Canvas/Helpers/WindowsNotificationHelper.cs index 13f15c82..d86eac40 100644 --- a/Ink Canvas/Helpers/WindowsNotificationHelper.cs +++ b/Ink Canvas/Helpers/WindowsNotificationHelper.cs @@ -24,8 +24,9 @@ public static void ShowNewVersionToast(string version) ShowToastForModernWindows(version); } } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"显示更新通知失败: {ex.Message}", LogHelper.LogType.Warning); } } @@ -45,8 +46,9 @@ private static void ShowBalloonForWin7(string version) $"发现新版本!:{version}", BalloonIcon.Info); } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"显示 Win7 气泡通知失败: {ex.Message}", LogHelper.LogType.Warning); } }); } From 17590f12cae79195032bc630c059457904efd2ec Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:30 +0800 Subject: [PATCH 3/8] Improve LocalizationHelper exception diagnostics --- Ink Canvas/Helpers/LocalizationHelper.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Ink Canvas/Helpers/LocalizationHelper.cs b/Ink Canvas/Helpers/LocalizationHelper.cs index 0890d0d0..79d84ceb 100644 --- a/Ink Canvas/Helpers/LocalizationHelper.cs +++ b/Ink Canvas/Helpers/LocalizationHelper.cs @@ -1,4 +1,5 @@ using Ink_Canvas.Properties; +using System; using System.Globalization; using System.Threading; @@ -40,8 +41,9 @@ public static bool TrySetCulture(string cultureName) CurrentCulture = culture; return true; } - catch + catch (Exception ex) { + System.Diagnostics.Debug.WriteLine($"[LocalizationHelper] 切换语言失败: {ex.Message}"); return false; } } From f891f15bc3d72cbd479ae6b0abf48464aa031499 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:37 +0800 Subject: [PATCH 4/8] Improve ForegroundWindowInfo process path diagnostics --- Ink Canvas/Helpers/ForegroundWindowInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/Helpers/ForegroundWindowInfo.cs b/Ink Canvas/Helpers/ForegroundWindowInfo.cs index 8759468a..ca44fdfc 100644 --- a/Ink Canvas/Helpers/ForegroundWindowInfo.cs +++ b/Ink Canvas/Helpers/ForegroundWindowInfo.cs @@ -115,9 +115,9 @@ public static string ProcessPath() Process process = Process.GetProcessById((int)processId); return process.MainModule.FileName; } - catch + catch (Exception ex) { - // Process with the given ID not found + Debug.WriteLine($"[ForegroundWindowInfo] 获取前台进程路径失败: {ex.Message}"); return "Unknown"; } } From d3ac970c81d2368ec7a76f9bab52bec056f9025b Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:45 +0800 Subject: [PATCH 5/8] Add debug diagnostics for FullScreenHelper catch paths --- Ink Canvas/Helpers/FullScreenHelper.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/Helpers/FullScreenHelper.cs b/Ink Canvas/Helpers/FullScreenHelper.cs index a1dced48..8f6672ed 100644 --- a/Ink Canvas/Helpers/FullScreenHelper.cs +++ b/Ink Canvas/Helpers/FullScreenHelper.cs @@ -25,9 +25,9 @@ public static void MarkFullscreenWindowTaskbarList(IntPtr hwnd, bool isFullscree var obj = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_TaskbarList)); (obj as ITaskbarList2)?.MarkFullscreenWindow(hwnd, isFullscreen); } - catch + catch (Exception ex) { - //应该不会挂 + System.Diagnostics.Debug.WriteLine($"[FullScreenHelper] 标记任务栏全屏状态失败: {ex.Message}"); } } @@ -286,9 +286,9 @@ private static IntPtr KeepFullScreenHook(IntPtr hwnd, int msg, IntPtr wParam, In } } } - catch + catch (Exception ex) { - // 这里也不需要日志啥的,只是为了防止上面有逗比逻辑,在消息循环里面炸了 + System.Diagnostics.Debug.WriteLine($"[FullScreenHelper] 处理全屏 Hook 消息失败: {ex.Message}"); } } From 13ca112da52b3d9a2fd4690a6ec386f794cebe07 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:51 +0800 Subject: [PATCH 6/8] Improve ScreenDetectionHelper exception observability --- Ink Canvas/Helpers/ScreenDetectionHelper.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/Helpers/ScreenDetectionHelper.cs b/Ink Canvas/Helpers/ScreenDetectionHelper.cs index 52c0c477..75db5e3b 100644 --- a/Ink Canvas/Helpers/ScreenDetectionHelper.cs +++ b/Ink Canvas/Helpers/ScreenDetectionHelper.cs @@ -76,8 +76,9 @@ private static Rectangle GetWindowScreenBounds(Window window) (int)(bottomRight.X - topLeft.X), (int)(bottomRight.Y - topLeft.Y)); } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"获取窗口屏幕边界失败: {ex.Message}", LogHelper.LogType.Warning); // 如果无法获取精确位置,返回窗口的Left和Top return new Rectangle( (int)window.Left, @@ -97,8 +98,9 @@ public static bool HasMultipleScreens() { return Screen.AllScreens.Length > 1; } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"检测多屏状态失败: {ex.Message}", LogHelper.LogType.Warning); return false; } } @@ -113,8 +115,9 @@ public static Screen GetPrimaryScreen() { return Screen.PrimaryScreen; } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"获取主屏幕失败: {ex.Message}", LogHelper.LogType.Warning); return null; } } @@ -129,8 +132,9 @@ public static Screen[] GetAllScreens() { return Screen.AllScreens; } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"获取屏幕列表失败: {ex.Message}", LogHelper.LogType.Warning); return new Screen[] { Screen.PrimaryScreen }; } } @@ -147,8 +151,9 @@ public static bool IsWindowOnPrimaryScreen(Window window) var windowScreen = GetWindowScreen(window); return windowScreen == Screen.PrimaryScreen; } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"检测窗口是否在主屏幕失败: {ex.Message}", LogHelper.LogType.Warning); return true; // 出错时假设在主屏幕 } } From c4a29cfecb41da531a43f3df9f6b742d72d6badf Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:43:58 +0800 Subject: [PATCH 7/8] Add diagnostics for WebDav uploader failure paths --- Ink Canvas/Helpers/WebDavUploader.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/Helpers/WebDavUploader.cs b/Ink Canvas/Helpers/WebDavUploader.cs index 935c59d2..df87e3e4 100644 --- a/Ink Canvas/Helpers/WebDavUploader.cs +++ b/Ink Canvas/Helpers/WebDavUploader.cs @@ -101,8 +101,9 @@ public static async Task UploadFileAsync(string filePath, CancellationToke { throw; } - catch (Exception) + catch (Exception ex) { + LogHelper.WriteLogToFile($"WebDav 上传失败: {ex.Message}", LogHelper.LogType.Warning); return false; } } @@ -137,9 +138,9 @@ private static async Task EnsureDirectoryExistsAsync(IWebDavClient client, strin await client.Mkcol(currentPath); } } - catch (Exception) + catch (Exception ex) { - // 静默处理目录创建错误 + LogHelper.WriteLogToFile($"WebDav 创建目录失败: {directoryPath}, {ex.Message}", LogHelper.LogType.Warning); } } @@ -162,8 +163,9 @@ public static bool IsWebDavEnabled() new Uri(webDavUrl); return true; } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"WebDav 地址无效: {webDavUrl}, {ex.Message}", LogHelper.LogType.Warning); return false; } } From e5d7cee72d60cd99ea886915a8e4cf3569f4d672 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:44:05 +0800 Subject: [PATCH 8/8] Add diagnostics for IACore DLL validation failures --- Ink Canvas/Helpers/IACoreDllExtractor.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ink Canvas/Helpers/IACoreDllExtractor.cs b/Ink Canvas/Helpers/IACoreDllExtractor.cs index a2f9dc37..31ba0968 100644 --- a/Ink Canvas/Helpers/IACoreDllExtractor.cs +++ b/Ink Canvas/Helpers/IACoreDllExtractor.cs @@ -125,8 +125,9 @@ private static bool IsValidDll(string filePath) return false; } - catch + catch (Exception ex) { + System.Diagnostics.Debug.WriteLine($"[IACoreDllExtractor] 校验DLL失败: {filePath}, {ex.Message}"); return false; } }