diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs index 36e71425..467adec2 100644 --- a/Ink Canvas/Helpers/GlobalHotkeyManager.cs +++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs @@ -288,7 +288,7 @@ namespace Ink_Canvas.Helpers } else { - // 如果配置文件不存在,才使用默认快捷键 + // 如果配置文件不存在或加载失败,使用默认快捷键 if (!File.Exists(HotkeyConfigFile)) { LogHelper.WriteLogToFile("配置文件不存在,注册默认快捷键", LogHelper.LogType.Info); @@ -297,7 +297,9 @@ namespace Ink_Canvas.Helpers } else { - LogHelper.WriteLogToFile("配置文件存在但加载失败,保持当前状态", LogHelper.LogType.Warning); + LogHelper.WriteLogToFile("配置文件存在但加载失败,回退到默认快捷键", LogHelper.LogType.Warning); + RegisterDefaultHotkeys(); + _hotkeysShouldBeRegistered = true; } } } @@ -350,7 +352,9 @@ namespace Ink_Canvas.Helpers } else { - LogHelper.WriteLogToFile("快捷键注册功能已经启用", LogHelper.LogType.Info); + LogHelper.WriteLogToFile("快捷键注册功能已经启用,重新加载快捷键设置", LogHelper.LogType.Info); + // 即使已经启用,也要重新加载快捷键设置以确保快捷键正常工作 + LoadHotkeysFromSettings(); } } catch (Exception ex) @@ -359,6 +363,61 @@ namespace Ink_Canvas.Helpers } } + /// + /// 禁用快捷键注册功能 + /// 调用此方法后,快捷键将被注销 + /// + public void DisableHotkeyRegistration() + { + try + { + if (_hotkeysShouldBeRegistered) + { + _hotkeysShouldBeRegistered = false; + LogHelper.WriteLogToFile("禁用快捷键注册功能", LogHelper.LogType.Info); + + // 注销所有快捷键 + UnregisterAllHotkeys(); + } + else + { + LogHelper.WriteLogToFile("快捷键注册功能已经禁用", LogHelper.LogType.Info); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"禁用快捷键注册功能时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 根据当前工具模式更新快捷键状态 + /// 在工具切换时调用此方法 + /// + /// 是否为鼠标模式(选择模式) + public void UpdateHotkeyStateForToolMode(bool isMouseMode) + { + try + { + if (isMouseMode) + { + // 鼠标模式下禁用快捷键,让键盘操作放行 + DisableHotkeyRegistration(); + LogHelper.WriteLogToFile("切换到鼠标模式,禁用快捷键以放行键盘操作", LogHelper.LogType.Info); + } + else + { + // 非鼠标模式下启用快捷键 + EnableHotkeyRegistration(); + LogHelper.WriteLogToFile("切换到非鼠标模式,启用快捷键", LogHelper.LogType.Info); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"更新快捷键状态时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + /// /// 更新快捷键配置 /// @@ -752,44 +811,6 @@ namespace Ink_Canvas.Helpers } } - /// - /// 鼠标事件处理方法 - /// - private void OnMouseModeEvent(object sender, MouseEventArgs e) - { - bool isMouseMode = IsInSelectMode(); - - if (isMouseMode) - { - // 在鼠标模式下设置事件处理状态 - e.Handled = false; - } - else - { - e.Handled = true; - EnableHotkeyRegistration(); - LoadHotkeysFromSettings(); - } - // 更新快捷键注册状态 - try - { - var hotkeyManagerField = this.GetType().GetField("_globalHotkeyManager", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - if (hotkeyManagerField != null) - { - var hotkeyManager = hotkeyManagerField.GetValue(this); - if (hotkeyManager != null) - { - var updateMethod = hotkeyManager.GetType().GetMethod("UpdateHotkeyRegistrationState"); - updateMethod?.Invoke(hotkeyManager, null); - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"更新快捷键状态时出错: {ex.Message}", LogHelper.LogType.Warning); - } - } #endregion diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index c4667900..27d2234e 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -274,7 +274,8 @@ namespace Ink_Canvas drawingAttributes.FitToCurve = Settings.Canvas.FitToCurve; } - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); inkCanvas.Gesture += InkCanvas_Gesture; } catch { } @@ -2025,8 +2026,9 @@ namespace Ink_Canvas try { _globalHotkeyManager = new GlobalHotkeyManager(this); - // 不在这里加载快捷键,等待需要时再加载 - LogHelper.WriteLogToFile("全局快捷键管理器已初始化(未加载快捷键)", LogHelper.LogType.Event); + // 启动时加载快捷键,默认启用 + _globalHotkeyManager.EnableHotkeyRegistration(); + LogHelper.WriteLogToFile("全局快捷键管理器已初始化并加载快捷键", LogHelper.LogType.Event); } catch (Exception ex) { @@ -2179,5 +2181,38 @@ namespace Ink_Canvas } } #endregion + + /// + /// 集中管理工具模式切换和快捷键状态更新 + /// 避免在每个工具按钮点击时重复刷新快捷键状态 + /// + /// 新的编辑模式 + /// 可选的额外操作委托 + internal void SetCurrentToolMode(InkCanvasEditingMode newMode, Action additionalActions = null) + { + try + { + // 执行模式切换 + inkCanvas.EditingMode = newMode; + + // 根据模式确定是否为鼠标模式(无工具模式) + bool isMouseMode = newMode == InkCanvasEditingMode.None; + + // 更新快捷键状态 + if (_globalHotkeyManager != null) + { + _globalHotkeyManager.UpdateHotkeyStateForToolMode(isMouseMode); + } + + // 执行额外的操作(如果有) + additionalActions?.Invoke(); + + LogHelper.WriteLogToFile($"工具模式已切换到: {newMode}, 鼠标模式: {isMouseMode}", LogHelper.LogType.Trace); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"设置工具模式时出错: {ex.Message}", LogHelper.LogType.Error); + } + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs index 03ee7c86..f94917af 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs @@ -704,7 +704,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); SetCursorBasedOnEditingMode(inkCanvas); } @@ -721,7 +722,8 @@ namespace Ink_Canvas forcePointEraser = false; inkCanvas.EraserShape = new EllipseStylusShape(5, 5); - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByStroke); drawingShapeMode = 0; // 修复:切换到线擦时,确保重置笔的状态 diff --git a/Ink Canvas/MainWindow_cs/MW_Colors.cs b/Ink Canvas/MainWindow_cs/MW_Colors.cs index baa50911..57ce6f80 100644 --- a/Ink Canvas/MainWindow_cs/MW_Colors.cs +++ b/Ink Canvas/MainWindow_cs/MW_Colors.cs @@ -64,7 +64,8 @@ namespace Ink_Canvas { inkCanvas.IsManipulationEnabled = true; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); CancelSingleFingerDragMode(); CheckColorTheme(); } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index d86e5d7a..f70732f8 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1562,6 +1562,10 @@ namespace Ink_Canvas // 隱藏高亮 HideFloatingBarHighlight(); + // 使用集中化的工具模式切换方法,确保快捷键状态正确更新 + // 鼠标模式下应该禁用快捷键以放行键盘操作 + SetCurrentToolMode(InkCanvasEditingMode.None); + // 切换前自动截图保存墨迹 if (inkCanvas.Strokes.Count > 0 && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) @@ -1684,7 +1688,8 @@ namespace Ink_Canvas if (Pen_Icon.Background == null || StackPanelCanvasControls.Visibility == Visibility.Collapsed) { - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); GridTransparencyFakeBackground.Opacity = 1; GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); @@ -1717,7 +1722,8 @@ namespace Ink_Canvas StackPanelCanvasControls.Visibility = Visibility.Visible; //AnimationsHelper.ShowWithSlideFromLeftAndFade(StackPanelCanvasControls); CheckEnableTwoFingerGestureBtnVisibility(true); - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); // 在批注模式下显示快捷调色盘(如果设置中启用了) if (Settings.Appearance.IsShowQuickColorPalette && QuickColorPalettePanel != null && QuickColorPaletteSingleRowPanel != null) @@ -1838,7 +1844,8 @@ namespace Ink_Canvas { SaveStrokes(); } - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink); // 修复:从线擦切换到批注时,保持之前的笔类型状态 forceEraser = false; @@ -1898,7 +1905,8 @@ namespace Ink_Canvas EnableAdvancedEraserSystem(); // 使用新的高级橡皮擦系统 - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByPoint); ApplyAdvancedEraserShape(); // 使用新的橡皮擦形状应用方法 SetCursorBasedOnEditingMode(inkCanvas); HideSubPanels("eraser"); // 高亮橡皮按钮 @@ -1937,7 +1945,8 @@ namespace Ink_Canvas EnableAdvancedEraserSystem(); // 使用新的高级橡皮擦系统 - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByPoint); ApplyAdvancedEraserShape(); // 使用新的橡皮擦形状应用方法 SetCursorBasedOnEditingMode(inkCanvas); HideSubPanels("eraser"); // 高亮橡皮按钮 @@ -1974,7 +1983,8 @@ namespace Ink_Canvas forcePointEraser = false; inkCanvas.EraserShape = new EllipseStylusShape(5, 5); - inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.EraseByStroke); drawingShapeMode = 0; // 修复:切换到线擦时,保存当前的笔类型状态,而不是强制重置 @@ -2255,7 +2265,8 @@ namespace Ink_Canvas } else { - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); } } diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index c302795f..a87dec7b 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -276,8 +276,10 @@ namespace Ink_Canvas { if (inkCanvas.GetSelectedStrokes().Count == inkCanvas.Strokes.Count) { - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Ink, () => { + SetCurrentToolMode(InkCanvasEditingMode.Select); + }); } else { @@ -290,7 +292,8 @@ namespace Ink_Canvas } else { - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); } } @@ -454,7 +457,8 @@ namespace Ink_Canvas else { // 新增:启动套索选择模式 - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); inkCanvas.Select(new StrokeCollection()); } } @@ -492,7 +496,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); SetCursorBasedOnEditingMode(inkCanvas); } @@ -502,7 +507,8 @@ namespace Ink_Canvas forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; - inkCanvas.EditingMode = InkCanvasEditingMode.Select; + // 使用集中化的工具模式切换方法 + SetCurrentToolMode(InkCanvasEditingMode.Select); inkCanvas.IsManipulationEnabled = true; SetCursorBasedOnEditingMode(inkCanvas); }