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);
}