From d1eed233999c9750821593cd616a30ab71204d93 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 24 Aug 2025 09:09:48 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/GlobalHotkeyManager.cs | 80 ++--- Ink Canvas/MainWindow.xaml.cs | 16 +- .../Windows/HotkeySettingsWindow.xaml.cs | 277 ++++++++++++++---- 3 files changed, 257 insertions(+), 116 deletions(-) diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs index 82cb01c9..56d939e8 100644 --- a/Ink Canvas/Helpers/GlobalHotkeyManager.cs +++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs @@ -17,11 +17,10 @@ namespace Ink_Canvas.Helpers private readonly Dictionary _registeredHotkeys; private readonly MainWindow _mainWindow; private bool _isDisposed = false; - private bool _hotkeysShouldBeRegistered = true; // 跟踪快捷键是否应该被注册 + private bool _hotkeysShouldBeRegistered = false; // 启动时不注册热键,等待需要时再注册 // 配置文件路径 private static readonly string HotkeyConfigFile = Path.Combine(App.RootPath, "HotkeyConfig.json"); - private static readonly string HotkeyConfigBackupFile = Path.Combine(App.RootPath, "HotkeyConfig.json.bak"); #endregion #region Constructor @@ -212,7 +211,7 @@ namespace Ink_Canvas.Helpers } /// - /// 从设置加载快捷键配置 + /// 从设置加载快捷键 /// public void LoadHotkeysFromSettings() { @@ -232,20 +231,28 @@ namespace Ink_Canvas.Helpers { // 成功从配置文件加载快捷键设置 _hotkeysShouldBeRegistered = true; + LogHelper.WriteLogToFile("成功从配置文件加载快捷键设置", LogHelper.LogType.Info); } else { - // 如果配置文件不存在或加载失败,使用默认快捷键 - RegisterDefaultHotkeys(); - _hotkeysShouldBeRegistered = true; + // 如果配置文件不存在,才使用默认快捷键 + if (!File.Exists(HotkeyConfigFile)) + { + LogHelper.WriteLogToFile("配置文件不存在,注册默认快捷键", LogHelper.LogType.Info); + RegisterDefaultHotkeys(); + _hotkeysShouldBeRegistered = true; + } + else + { + LogHelper.WriteLogToFile("配置文件存在但加载失败,保持当前状态", LogHelper.LogType.Warning); + } } } - catch (Exception ex) - { - // 出错时使用默认快捷键 - RegisterDefaultHotkeys(); - _hotkeysShouldBeRegistered = true; - } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"从设置加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error); + // 出错时不自动使用默认快捷键,保持当前状态 + } } /// @@ -283,18 +290,14 @@ namespace Ink_Canvas.Helpers if (!_hotkeysShouldBeRegistered) { _hotkeysShouldBeRegistered = true; + LogHelper.WriteLogToFile("启用快捷键注册功能", LogHelper.LogType.Info); - // 如果当前不在鼠标模式下,立即注册快捷键 - var currentIsMouseMode = IsInSelectMode(); - - if (!currentIsMouseMode) - { - LoadHotkeysFromSettings(); - } + // 立即加载快捷键设置 + LoadHotkeysFromSettings(); } else { - // 快捷键注册功能已经启用 + LogHelper.WriteLogToFile("快捷键注册功能已经启用", LogHelper.LogType.Info); } } catch (Exception ex) @@ -445,29 +448,6 @@ namespace Ink_Canvas.Helpers catch (Exception ex) { LogHelper.WriteLogToFile($"从配置文件加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error); - - // 尝试从备份文件加载 - if (File.Exists(HotkeyConfigBackupFile)) - { - LogHelper.WriteLogToFile("尝试从备份文件加载快捷键配置", LogHelper.LogType.Warning); - try - { - string backupContent = File.ReadAllText(HotkeyConfigBackupFile, System.Text.Encoding.UTF8); - var backupConfig = JsonConvert.DeserializeObject(backupContent); - if (backupConfig?.Hotkeys != null && backupConfig.Hotkeys.Count > 0) - { - // 恢复备份文件 - File.Copy(HotkeyConfigBackupFile, HotkeyConfigFile, true); - LogHelper.WriteLogToFile("已从备份文件恢复快捷键配置", LogHelper.LogType.Event); - return LoadHotkeysFromConfigFile(); - } - } - catch (Exception backupEx) - { - LogHelper.WriteLogToFile($"从备份文件加载快捷键配置时出错: {backupEx.Message}", LogHelper.LogType.Error); - } - } - return false; } } @@ -514,18 +494,8 @@ namespace Ink_Canvas.Helpers string jsonContent = JsonConvert.SerializeObject(config, settings); - // 先写入临时文件,然后替换原文件(原子操作) - string tempFile = HotkeyConfigFile + ".temp"; - File.WriteAllText(tempFile, jsonContent, System.Text.Encoding.UTF8); - - // 如果原文件存在,先备份 - if (File.Exists(HotkeyConfigFile)) - { - File.Copy(HotkeyConfigFile, HotkeyConfigBackupFile, true); - } - - // 替换原文件 - File.Move(tempFile, HotkeyConfigFile); + // 直接写入原文件,覆盖原有内容 + File.WriteAllText(HotkeyConfigFile, jsonContent, System.Text.Encoding.UTF8); LogHelper.WriteLogToFile($"快捷键配置已保存到: {HotkeyConfigFile}", LogHelper.LogType.Event); return true; diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 93f58fb1..a744cc09 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -2016,8 +2016,8 @@ namespace Ink_Canvas try { _globalHotkeyManager = new GlobalHotkeyManager(this); - _globalHotkeyManager.LoadHotkeysFromSettings(); - LogHelper.WriteLogToFile("全局快捷键管理器已初始化", LogHelper.LogType.Event); + // 不在这里加载快捷键,等待需要时再加载 + LogHelper.WriteLogToFile("全局快捷键管理器已初始化(未加载快捷键)", LogHelper.LogType.Event); } catch (Exception ex) { @@ -2064,6 +2064,12 @@ namespace Ink_Canvas { ToggleSwitchInkFadeInPanel.IsOn = Settings.Canvas.EnableInkFade; } + + // 同步普通画笔面板中的开关状态 + if (ToggleSwitchInkFadeInPanel2 != null) + { + ToggleSwitchInkFadeInPanel2.IsOn = Settings.Canvas.EnableInkFade; + } LogHelper.WriteLogToFile($"墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "启用" : "禁用")}", LogHelper.LogType.Event); } @@ -2107,6 +2113,12 @@ namespace Ink_Canvas { ToggleSwitchEnableInkFade.IsOn = Settings.Canvas.EnableInkFade; } + + // 同步普通画笔面板中的开关状态 + if (ToggleSwitchInkFadeInPanel2 != null) + { + ToggleSwitchInkFadeInPanel2.IsOn = Settings.Canvas.EnableInkFade; + } LogHelper.WriteLogToFile($"批注子面板中墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "启用" : "禁用")}", LogHelper.LogType.Event); } diff --git a/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs b/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs index 1d3c30dc..d723c0f6 100644 --- a/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs @@ -28,8 +28,22 @@ namespace Ink_Canvas.Windows // 隐藏主窗口的设置页面 HideMainWindowSettings(); InitializeHotkeyItems(); - LoadCurrentHotkeys(); - SetupEventHandlers(); + + // 延迟加载快捷键,确保快捷键管理器已完全初始化 + this.Loaded += (s, e) => + { + try + { + // 不自动启用快捷键注册功能,让用户手动决定 + // 只加载当前已注册的快捷键 + LoadCurrentHotkeys(); + SetupEventHandlers(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"快捷键设置窗口初始化时出错: {ex.Message}", LogHelper.LogType.Error); + } + }; // 注册窗口关闭事件 this.Closed += HotkeySettingsWindow_Closed; @@ -39,60 +53,71 @@ namespace Ink_Canvas.Windows #region Private Methods private void InitializeHotkeyItems() { - // 初始化快捷键项并设置HotkeyName - _hotkeyItems["Undo"] = UndoHotkey; - UndoHotkey.HotkeyName = "Undo"; - - _hotkeyItems["Redo"] = RedoHotkey; - RedoHotkey.HotkeyName = "Redo"; - - _hotkeyItems["Clear"] = ClearHotkey; - ClearHotkey.HotkeyName = "Clear"; - - _hotkeyItems["Paste"] = PasteHotkey; - PasteHotkey.HotkeyName = "Paste"; - - _hotkeyItems["SelectTool"] = SelectToolHotkey; - SelectToolHotkey.HotkeyName = "SelectTool"; - - _hotkeyItems["DrawTool"] = DrawToolHotkey; - DrawToolHotkey.HotkeyName = "DrawTool"; - - _hotkeyItems["EraserTool"] = EraserToolHotkey; - EraserToolHotkey.HotkeyName = "EraserTool"; - - _hotkeyItems["BlackboardTool"] = BlackboardToolHotkey; - BlackboardToolHotkey.HotkeyName = "BlackboardTool"; - - _hotkeyItems["QuitDrawTool"] = QuitDrawToolHotkey; - QuitDrawToolHotkey.HotkeyName = "QuitDrawTool"; - - _hotkeyItems["Pen1"] = Pen1Hotkey; - Pen1Hotkey.HotkeyName = "Pen1"; - - _hotkeyItems["Pen2"] = Pen2Hotkey; - Pen2Hotkey.HotkeyName = "Pen2"; - - _hotkeyItems["Pen3"] = Pen3Hotkey; - Pen3Hotkey.HotkeyName = "Pen3"; - - _hotkeyItems["Pen4"] = Pen4Hotkey; - Pen4Hotkey.HotkeyName = "Pen4"; - - _hotkeyItems["Pen5"] = Pen5Hotkey; - Pen5Hotkey.HotkeyName = "Pen5"; - - _hotkeyItems["DrawLine"] = DrawLineHotkey; - DrawLineHotkey.HotkeyName = "DrawLine"; - - _hotkeyItems["Screenshot"] = ScreenshotHotkey; - ScreenshotHotkey.HotkeyName = "Screenshot"; - - _hotkeyItems["Hide"] = HideHotkey; - HideHotkey.HotkeyName = "Hide"; - - _hotkeyItems["Exit"] = ExitHotkey; - ExitHotkey.HotkeyName = "Exit"; + try + { + LogHelper.WriteLogToFile("开始初始化快捷键项", LogHelper.LogType.Info); + + // 初始化快捷键项并设置HotkeyName + _hotkeyItems["Undo"] = UndoHotkey; + UndoHotkey.HotkeyName = "Undo"; + + _hotkeyItems["Redo"] = RedoHotkey; + RedoHotkey.HotkeyName = "Redo"; + + _hotkeyItems["Clear"] = ClearHotkey; + ClearHotkey.HotkeyName = "Clear"; + + _hotkeyItems["Paste"] = PasteHotkey; + PasteHotkey.HotkeyName = "Paste"; + + _hotkeyItems["SelectTool"] = SelectToolHotkey; + SelectToolHotkey.HotkeyName = "SelectTool"; + + _hotkeyItems["DrawTool"] = DrawToolHotkey; + DrawToolHotkey.HotkeyName = "DrawTool"; + + _hotkeyItems["EraserTool"] = EraserToolHotkey; + EraserToolHotkey.HotkeyName = "EraserTool"; + + _hotkeyItems["BlackboardTool"] = BlackboardToolHotkey; + BlackboardToolHotkey.HotkeyName = "BlackboardTool"; + + _hotkeyItems["QuitDrawTool"] = QuitDrawToolHotkey; + QuitDrawToolHotkey.HotkeyName = "QuitDrawTool"; + + _hotkeyItems["Pen1"] = Pen1Hotkey; + Pen1Hotkey.HotkeyName = "Pen1"; + + _hotkeyItems["Pen2"] = Pen2Hotkey; + Pen2Hotkey.HotkeyName = "Pen2"; + + _hotkeyItems["Pen3"] = Pen3Hotkey; + Pen3Hotkey.HotkeyName = "Pen3"; + + _hotkeyItems["Pen4"] = Pen4Hotkey; + Pen4Hotkey.HotkeyName = "Pen4"; + + _hotkeyItems["Pen5"] = Pen5Hotkey; + Pen5Hotkey.HotkeyName = "Pen5"; + + _hotkeyItems["DrawLine"] = DrawLineHotkey; + DrawLineHotkey.HotkeyName = "DrawLine"; + + _hotkeyItems["Screenshot"] = ScreenshotHotkey; + ScreenshotHotkey.HotkeyName = "Screenshot"; + + _hotkeyItems["Hide"] = HideHotkey; + HideHotkey.HotkeyName = "Hide"; + + _hotkeyItems["Exit"] = ExitHotkey; + ExitHotkey.HotkeyName = "Exit"; + + LogHelper.WriteLogToFile($"成功初始化 {_hotkeyItems.Count} 个快捷键项", LogHelper.LogType.Info); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"初始化快捷键项时出错: {ex.Message}", LogHelper.LogType.Error); + } } private void LoadCurrentHotkeys() @@ -100,13 +125,21 @@ namespace Ink_Canvas.Windows try { var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys(); + LogHelper.WriteLogToFile($"当前已注册快捷键数量: {registeredHotkeys.Count}", LogHelper.LogType.Info); + + // 显示已注册的快捷键 foreach (var hotkey in registeredHotkeys) { if (_hotkeyItems.TryGetValue(hotkey.Name, out var hotkeyItem)) { hotkeyItem.SetCurrentHotkey(hotkey.Key, hotkey.Modifiers); + LogHelper.WriteLogToFile($"设置快捷键项: {hotkey.Name} -> {hotkey.Modifiers}+{hotkey.Key}", LogHelper.LogType.Info); } } + + // 对于没有快捷键的项目,不设置任何值,保持为空状态 + // 这样用户就能清楚地知道哪些快捷键还没有设置 + LogHelper.WriteLogToFile("未注册的快捷键项保持为空状态", LogHelper.LogType.Info); } catch (Exception ex) { @@ -114,6 +147,78 @@ namespace Ink_Canvas.Windows } } + /// + /// 为快捷键项设置默认值 + /// + private void SetDefaultHotkeyForItem(HotkeyItem hotkeyItem) + { + try + { + // 根据HotkeyName设置默认快捷键 + switch (hotkeyItem.HotkeyName) + { + case "Undo": + hotkeyItem.SetCurrentHotkey(Key.Z, ModifierKeys.Control); + break; + case "Redo": + hotkeyItem.SetCurrentHotkey(Key.Y, ModifierKeys.Control); + break; + case "Clear": + hotkeyItem.SetCurrentHotkey(Key.E, ModifierKeys.Control); + break; + case "Paste": + hotkeyItem.SetCurrentHotkey(Key.V, ModifierKeys.Control); + break; + case "SelectTool": + hotkeyItem.SetCurrentHotkey(Key.S, ModifierKeys.Alt); + break; + case "DrawTool": + hotkeyItem.SetCurrentHotkey(Key.D, ModifierKeys.Alt); + break; + case "EraserTool": + hotkeyItem.SetCurrentHotkey(Key.E, ModifierKeys.Alt); + break; + case "BlackboardTool": + hotkeyItem.SetCurrentHotkey(Key.B, ModifierKeys.Alt); + break; + case "QuitDrawTool": + hotkeyItem.SetCurrentHotkey(Key.Q, ModifierKeys.Alt); + break; + case "Pen1": + hotkeyItem.SetCurrentHotkey(Key.D1, ModifierKeys.Alt); + break; + case "Pen2": + hotkeyItem.SetCurrentHotkey(Key.D2, ModifierKeys.Alt); + break; + case "Pen3": + hotkeyItem.SetCurrentHotkey(Key.D3, ModifierKeys.Alt); + break; + case "Pen4": + hotkeyItem.SetCurrentHotkey(Key.D4, ModifierKeys.Alt); + break; + case "Pen5": + hotkeyItem.SetCurrentHotkey(Key.D5, ModifierKeys.Alt); + break; + case "DrawLine": + hotkeyItem.SetCurrentHotkey(Key.L, ModifierKeys.Alt); + break; + case "Screenshot": + hotkeyItem.SetCurrentHotkey(Key.C, ModifierKeys.Alt); + break; + case "Hide": + hotkeyItem.SetCurrentHotkey(Key.V, ModifierKeys.Alt); + break; + case "Exit": + hotkeyItem.SetCurrentHotkey(Key.Escape, ModifierKeys.None); + break; + } + } + catch (Exception ex) + { + // 设置默认快捷键时出错,忽略 + } + } + private void SetupEventHandlers() { // 为每个快捷键项设置事件处理器 @@ -127,6 +232,8 @@ namespace Ink_Canvas.Windows { try { + LogHelper.WriteLogToFile($"收到快捷键变更事件: {e.HotkeyName} -> {e.Modifiers}+{e.Key}", LogHelper.LogType.Info); + // 检查快捷键冲突 if (IsHotkeyConflict(e.Key, e.Modifiers, e.HotkeyName)) { @@ -146,6 +253,7 @@ namespace Ink_Canvas.Windows private bool IsHotkeyConflict(Key key, ModifierKeys modifiers, string excludeHotkeyName) { + // 检查是否与已注册的快捷键冲突 var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys(); foreach (var hotkey in registeredHotkeys) { @@ -156,6 +264,29 @@ namespace Ink_Canvas.Windows return true; } } + + // 检查是否与默认快捷键冲突(如果当前快捷键项还没有注册) + if (excludeHotkeyName != null && _hotkeyItems.TryGetValue(excludeHotkeyName, out var currentItem)) + { + var currentHotkey = currentItem.GetCurrentHotkey(); + if (currentHotkey.key == Key.None) + { + // 如果当前项还没有快捷键,检查是否与其他默认快捷键冲突 + foreach (var kvp in _hotkeyItems) + { + if (kvp.Key != excludeHotkeyName) + { + var item = kvp.Value; + var itemHotkey = item.GetCurrentHotkey(); + if (itemHotkey.key == key && itemHotkey.modifiers == modifiers) + { + return true; + } + } + } + } + } + return false; } @@ -163,20 +294,42 @@ namespace Ink_Canvas.Windows { try { + LogHelper.WriteLogToFile($"开始更新快捷键: {hotkeyName} -> {modifiers}+{key}", LogHelper.LogType.Info); + + // 先注销原有的快捷键(如果存在) + _hotkeyManager.UnregisterHotkey(hotkeyName); + LogHelper.WriteLogToFile($"已注销原有快捷键: {hotkeyName}", LogHelper.LogType.Info); + // 根据快捷键名称获取对应的动作 var action = GetActionForHotkey(hotkeyName); if (action != null) { - // 使用快捷键管理器的UpdateHotkey方法,这会自动保存配置 - if (_hotkeyManager.UpdateHotkey(hotkeyName, key, modifiers)) + LogHelper.WriteLogToFile($"找到快捷键动作: {hotkeyName}", LogHelper.LogType.Info); + + // 直接注册新的快捷键 + if (_hotkeyManager.RegisterHotkey(hotkeyName, key, modifiers, action)) { - LogHelper.WriteLogToFile($"快捷键 {hotkeyName} 已更新为 {modifiers}+{key} 并自动保存", LogHelper.LogType.Event); + LogHelper.WriteLogToFile($"成功注册新快捷键: {hotkeyName} -> {modifiers}+{key}", LogHelper.LogType.Info); + + // 立即保存到配置文件 + _hotkeyManager.SaveHotkeysToSettings(); + LogHelper.WriteLogToFile($"已保存快捷键配置", LogHelper.LogType.Info); + + // 更新UI显示 + LoadCurrentHotkeys(); + LogHelper.WriteLogToFile($"已更新UI显示", LogHelper.LogType.Info); + + LogHelper.WriteLogToFile($"快捷键 {hotkeyName} 已更新为 {modifiers}+{key} 并保存", LogHelper.LogType.Event); } else { LogHelper.WriteLogToFile($"更新快捷键 {hotkeyName} 失败", LogHelper.LogType.Error); } } + else + { + LogHelper.WriteLogToFile($"未找到快捷键 {hotkeyName} 对应的动作", LogHelper.LogType.Warning); + } } catch (Exception ex) { @@ -351,9 +504,15 @@ namespace Ink_Canvas.Windows "确认重置", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { + // 先注销所有现有快捷键 + _hotkeyManager.UnregisterAllHotkeys(); + // 重置为默认快捷键 _hotkeyManager.RegisterDefaultHotkeys(); + // 立即保存到配置文件 + _hotkeyManager.SaveHotkeysToSettings(); + // 更新UI显示 LoadCurrentHotkeys();