From 710a9014dd618840da790d40b2e5425a8cdf9b3a Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Sat, 23 Aug 2025 21:39:00 +0800
Subject: [PATCH] improve:issue #112
---
Ink Canvas/Helpers/GlobalHotkeyManager.cs | 301 +++++++++++++++
Ink Canvas/Helpers/InkFadeManager.cs | 264 +++++++++++++
Ink Canvas/Helpers/PPTUIManager.cs | 1 -
Ink Canvas/MainWindow.xaml.cs | 59 ++-
.../MainWindow_cs/MW_ClipboardHandler.cs | 2 +-
.../MainWindow_cs/MW_FloatingBarIcons.cs | 19 +-
Ink Canvas/MainWindow_cs/MW_Hotkeys.cs | 2 +-
Ink Canvas/MainWindow_cs/MW_Screenshot.cs | 2 +-
Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 4 +-
Ink Canvas/Windows/HotkeyItem.xaml | 65 ++++
Ink Canvas/Windows/HotkeyItem.xaml.cs | 166 ++++++++
Ink Canvas/Windows/HotkeySettingsWindow.xaml | 191 ++++++++++
.../Windows/HotkeySettingsWindow.xaml.cs | 357 ++++++++++++++++++
13 files changed, 1414 insertions(+), 19 deletions(-)
create mode 100644 Ink Canvas/Helpers/GlobalHotkeyManager.cs
create mode 100644 Ink Canvas/Helpers/InkFadeManager.cs
create mode 100644 Ink Canvas/Windows/HotkeyItem.xaml
create mode 100644 Ink Canvas/Windows/HotkeyItem.xaml.cs
create mode 100644 Ink Canvas/Windows/HotkeySettingsWindow.xaml
create mode 100644 Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs
diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs
new file mode 100644
index 00000000..4ab1a459
--- /dev/null
+++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs
@@ -0,0 +1,301 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Input;
+using NHotkey.Wpf;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// 全局快捷键管理器 - 使用NHotkey库实现全局快捷键功能
+ ///
+ public class GlobalHotkeyManager : IDisposable
+ {
+ #region Private Fields
+ private readonly Dictionary _registeredHotkeys;
+ private readonly MainWindow _mainWindow;
+ private bool _isDisposed = false;
+ #endregion
+
+ #region Constructor
+ public GlobalHotkeyManager(MainWindow mainWindow)
+ {
+ _mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
+ _registeredHotkeys = new Dictionary();
+ }
+ #endregion
+
+ #region Public Methods
+ ///
+ /// 注册全局快捷键
+ ///
+ /// 快捷键名称
+ /// 按键
+ /// 修饰键
+ /// 执行动作
+ /// 是否注册成功
+ public bool RegisterHotkey(string hotkeyName, Key key, ModifierKeys modifiers, Action action)
+ {
+ try
+ {
+ if (_isDisposed)
+ return false;
+
+ // 如果快捷键已存在,先注销
+ if (_registeredHotkeys.ContainsKey(hotkeyName))
+ {
+ UnregisterHotkey(hotkeyName);
+ }
+
+ // 创建快捷键信息
+ var hotkeyInfo = new HotkeyInfo
+ {
+ Name = hotkeyName,
+ Key = key,
+ Modifiers = modifiers,
+ Action = action
+ };
+
+ // 注册快捷键
+ HotkeyManager.Current.AddOrReplace(hotkeyName, key, modifiers, (sender, e) =>
+ {
+ try
+ {
+ // 确保在主线程中执行
+ _mainWindow.Dispatcher.Invoke(() =>
+ {
+ action?.Invoke();
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"执行快捷键 {hotkeyName} 时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ });
+
+ _registeredHotkeys[hotkeyName] = hotkeyInfo;
+ LogHelper.WriteLogToFile($"成功注册全局快捷键: {hotkeyName} ({modifiers}+{key})", LogHelper.LogType.Event);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"注册全局快捷键 {hotkeyName} 失败: {ex.Message}", LogHelper.LogType.Error);
+ return false;
+ }
+ }
+
+ ///
+ /// 注销指定快捷键
+ ///
+ /// 快捷键名称
+ /// 是否注销成功
+ public bool UnregisterHotkey(string hotkeyName)
+ {
+ try
+ {
+ if (_isDisposed || !_registeredHotkeys.ContainsKey(hotkeyName))
+ return false;
+
+ HotkeyManager.Current.Remove(hotkeyName);
+ _registeredHotkeys.Remove(hotkeyName);
+ LogHelper.WriteLogToFile($"成功注销全局快捷键: {hotkeyName}", LogHelper.LogType.Event);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"注销全局快捷键 {hotkeyName} 失败: {ex.Message}", LogHelper.LogType.Error);
+ return false;
+ }
+ }
+
+ ///
+ /// 注销所有快捷键
+ ///
+ public void UnregisterAllHotkeys()
+ {
+ try
+ {
+ if (_isDisposed)
+ return;
+
+ foreach (var hotkeyName in _registeredHotkeys.Keys)
+ {
+ try
+ {
+ HotkeyManager.Current.Remove(hotkeyName);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"注销快捷键 {hotkeyName} 时出错: {ex.Message}", LogHelper.LogType.Warning);
+ }
+ }
+
+ _registeredHotkeys.Clear();
+ LogHelper.WriteLogToFile("已注销所有全局快捷键", LogHelper.LogType.Event);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"注销所有快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 检查快捷键是否已注册
+ ///
+ /// 快捷键名称
+ /// 是否已注册
+ public bool IsHotkeyRegistered(string hotkeyName)
+ {
+ return _registeredHotkeys.ContainsKey(hotkeyName);
+ }
+
+ ///
+ /// 获取已注册的快捷键列表
+ ///
+ /// 快捷键信息列表
+ public List GetRegisteredHotkeys()
+ {
+ return new List(_registeredHotkeys.Values);
+ }
+
+ ///
+ /// 注册默认快捷键集合
+ ///
+ public void RegisterDefaultHotkeys()
+ {
+ try
+ {
+ // 基本操作快捷键
+ RegisterHotkey("Undo", Key.Z, ModifierKeys.Control, () => _mainWindow.SymbolIconUndo_MouseUp(null, null));
+ RegisterHotkey("Redo", Key.Y, ModifierKeys.Control, () => _mainWindow.SymbolIconRedo_MouseUp(null, null));
+ RegisterHotkey("Clear", Key.E, ModifierKeys.Control, () => _mainWindow.SymbolIconDelete_MouseUp(null, null));
+ RegisterHotkey("Paste", Key.V, ModifierKeys.Control, () => _mainWindow.HandleGlobalPaste(null, null));
+
+ // 工具切换快捷键
+ RegisterHotkey("SelectTool", Key.S, ModifierKeys.Alt, () => _mainWindow.SymbolIconSelect_MouseUp(null, null));
+ RegisterHotkey("DrawTool", Key.D, ModifierKeys.Alt, () => _mainWindow.PenIcon_Click(null, null));
+ RegisterHotkey("EraserTool", Key.E, ModifierKeys.Alt, () => _mainWindow.EraserIcon_Click(null, null));
+ RegisterHotkey("BlackboardTool", Key.B, ModifierKeys.Alt, () => _mainWindow.ImageBlackboard_MouseUp(null, null));
+ RegisterHotkey("QuitDrawTool", Key.Q, ModifierKeys.Alt, () => _mainWindow.CursorIcon_Click(null, null));
+
+ // 画笔快捷键 - 使用反射访问penType字段
+ RegisterHotkey("Pen1", Key.D1, ModifierKeys.Alt, () => SwitchToPenType(0));
+ RegisterHotkey("Pen2", Key.D2, ModifierKeys.Alt, () => SwitchToPenType(1));
+ RegisterHotkey("Pen3", Key.D3, ModifierKeys.Alt, () => SwitchToPenType(2));
+ RegisterHotkey("Pen4", Key.D4, ModifierKeys.Alt, () => SwitchToPenType(3));
+ RegisterHotkey("Pen5", Key.D5, ModifierKeys.Alt, () => SwitchToPenType(4));
+
+ // 功能快捷键
+ RegisterHotkey("DrawLine", Key.L, ModifierKeys.Alt, () => _mainWindow.BtnDrawLine_Click(null, null));
+ RegisterHotkey("Screenshot", Key.C, ModifierKeys.Alt, () => _mainWindow.SaveScreenShotToDesktop());
+ RegisterHotkey("Hide", Key.V, ModifierKeys.Alt, () => _mainWindow.SymbolIconEmoji_MouseUp(null, null));
+
+ // 退出快捷键
+ RegisterHotkey("Exit", Key.Escape, ModifierKeys.None, () => _mainWindow.KeyExit(null, null));
+
+ LogHelper.WriteLogToFile("已注册默认全局快捷键集合", LogHelper.LogType.Event);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"注册默认快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 从设置加载快捷键配置
+ ///
+ public void LoadHotkeysFromSettings()
+ {
+ try
+ {
+ // 这里可以从配置文件或设置中加载自定义快捷键
+ // 暂时使用默认快捷键
+ RegisterDefaultHotkeys();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"从设置加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 保存快捷键配置到设置
+ ///
+ public void SaveHotkeysToSettings()
+ {
+ try
+ {
+ // 这里可以将快捷键配置保存到配置文件或设置中
+ LogHelper.WriteLogToFile("快捷键配置已保存", LogHelper.LogType.Event);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"保存快捷键配置时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ #endregion
+
+ #region Private Helper Methods
+ ///
+ /// 切换到指定笔类型
+ ///
+ /// 笔类型索引
+ private void SwitchToPenType(int penTypeIndex)
+ {
+ try
+ {
+ // 通过反射访问主窗口的penType字段
+ var penTypeField = _mainWindow.GetType().GetField("penType",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ if (penTypeField != null)
+ {
+ penTypeField.SetValue(_mainWindow, penTypeIndex);
+
+ // 调用CheckPenTypeUIState方法更新UI状态
+ var checkPenTypeMethod = _mainWindow.GetType().GetMethod("CheckPenTypeUIState",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ if (checkPenTypeMethod != null)
+ {
+ checkPenTypeMethod.Invoke(_mainWindow, null);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"切换到笔类型{penTypeIndex}时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ #endregion
+
+ #region IDisposable Implementation
+ public void Dispose()
+ {
+ if (!_isDisposed)
+ {
+ UnregisterAllHotkeys();
+ _isDisposed = true;
+ }
+ }
+ #endregion
+
+ #region Nested Classes
+ ///
+ /// 快捷键信息类
+ ///
+ public class HotkeyInfo
+ {
+ public string Name { get; set; }
+ public Key Key { get; set; }
+ public ModifierKeys Modifiers { get; set; }
+ public Action Action { get; set; }
+
+ public override string ToString()
+ {
+ var modifiersText = Modifiers == ModifierKeys.None ? "" : $"{Modifiers}+";
+ return $"{modifiersText}{Key}";
+ }
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/InkFadeManager.cs b/Ink Canvas/Helpers/InkFadeManager.cs
new file mode 100644
index 00000000..6ddbc874
--- /dev/null
+++ b/Ink Canvas/Helpers/InkFadeManager.cs
@@ -0,0 +1,264 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Media.Animation;
+using System.Windows.Threading;
+using System.Windows.Ink;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// 墨迹渐隐管理器 - 管理墨迹的渐隐动画和状态
+ ///
+ public class InkFadeManager
+ {
+ #region Properties
+ ///
+ /// 是否启用墨迹渐隐功能
+ ///
+ public bool IsEnabled { get; set; } = false;
+
+ ///
+ /// 墨迹渐隐时间(毫秒)
+ ///
+ public int FadeTime { get; set; } = 3000;
+
+ ///
+ /// 渐隐动画持续时间(毫秒)
+ ///
+ public int AnimationDuration { get; set; } = 1000;
+ #endregion
+
+ #region Private Fields
+ private readonly MainWindow _mainWindow;
+ private readonly Dispatcher _dispatcher;
+ private readonly Dictionary _fadeTimers;
+ private readonly Dictionary _strokeVisuals;
+ #endregion
+
+ #region Constructor
+ public InkFadeManager(MainWindow mainWindow)
+ {
+ _mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
+ _dispatcher = _mainWindow.Dispatcher;
+ _fadeTimers = new Dictionary();
+ _strokeVisuals = new Dictionary();
+ }
+ #endregion
+
+ #region Public Methods
+ ///
+ /// 添加需要渐隐的墨迹
+ ///
+ /// 墨迹对象
+ /// 墨迹的视觉元素
+ public void AddFadingStroke(Stroke stroke, UIElement visual)
+ {
+ if (!IsEnabled || stroke == null || visual == null) return;
+
+ try
+ {
+ // 记录墨迹和视觉元素的对应关系
+ _strokeVisuals[stroke] = visual;
+
+ // 创建定时器,在指定时间后开始渐隐动画
+ var timer = new DispatcherTimer
+ {
+ Interval = TimeSpan.FromMilliseconds(FadeTime)
+ };
+
+ timer.Tick += (sender, e) =>
+ {
+ StartFadeAnimation(stroke);
+ timer.Stop();
+ _fadeTimers.Remove(stroke);
+ };
+
+ _fadeTimers[stroke] = timer;
+ timer.Start();
+
+ // 将视觉元素添加到画布上
+ _dispatcher.InvokeAsync(() =>
+ {
+ try
+ {
+ if (_mainWindow.inkCanvas != null)
+ {
+ _mainWindow.inkCanvas.Children.Add(visual);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"添加墨迹视觉元素到画布失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"添加渐隐墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 移除墨迹
+ ///
+ /// 要移除的墨迹
+ public void RemoveStroke(Stroke stroke)
+ {
+ if (stroke == null) return;
+
+ try
+ {
+ if (_fadeTimers.TryGetValue(stroke, out var timer))
+ {
+ timer.Stop();
+ _fadeTimers.Remove(stroke);
+ }
+
+ if (_strokeVisuals.TryGetValue(stroke, out var visual))
+ {
+ _dispatcher.InvokeAsync(() =>
+ {
+ try
+ {
+ if (_mainWindow.inkCanvas != null && _mainWindow.inkCanvas.Children.Contains(visual))
+ {
+ _mainWindow.inkCanvas.Children.Remove(visual);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"从画布移除墨迹视觉元素失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+
+ _strokeVisuals.Remove(stroke);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"移除渐隐墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 清除所有渐隐墨迹
+ ///
+ public void ClearAllFadingStrokes()
+ {
+ try
+ {
+ foreach (var timer in _fadeTimers.Values)
+ {
+ timer.Stop();
+ }
+
+ _fadeTimers.Clear();
+
+ _dispatcher.InvokeAsync(() =>
+ {
+ try
+ {
+ if (_mainWindow.inkCanvas != null)
+ {
+ foreach (var visual in _strokeVisuals.Values)
+ {
+ if (_mainWindow.inkCanvas.Children.Contains(visual))
+ {
+ _mainWindow.inkCanvas.Children.Remove(visual);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"清除所有墨迹视觉元素失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+
+ _strokeVisuals.Clear();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"清除所有渐隐墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 更新渐隐时间设置
+ ///
+ /// 新的渐隐时间(毫秒)
+ public void UpdateFadeTime(int fadeTime)
+ {
+ FadeTime = fadeTime;
+
+ foreach (var kvp in _fadeTimers)
+ {
+ var stroke = kvp.Key;
+ var timer = kvp.Value;
+
+ timer.Stop();
+ timer.Interval = TimeSpan.FromMilliseconds(FadeTime);
+ timer.Start();
+ }
+ }
+
+ ///
+ /// 更新动画持续时间设置
+ ///
+ /// 新的动画持续时间(毫秒)
+ public void UpdateAnimationDuration(int animationDuration)
+ {
+ AnimationDuration = animationDuration;
+ }
+ #endregion
+
+ #region Private Methods
+ ///
+ /// 开始渐隐动画
+ ///
+ /// 要渐隐的墨迹
+ private void StartFadeAnimation(Stroke stroke)
+ {
+ if (!_strokeVisuals.TryGetValue(stroke, out var visual)) return;
+
+ try
+ {
+ _dispatcher.InvokeAsync(() =>
+ {
+ var fadeAnimation = new DoubleAnimation
+ {
+ From = 1.0,
+ To = 0.0,
+ Duration = TimeSpan.FromMilliseconds(AnimationDuration),
+ EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut }
+ };
+
+ fadeAnimation.Completed += (sender, e) =>
+ {
+ try
+ {
+ if (_mainWindow.inkCanvas != null && _mainWindow.inkCanvas.Children.Contains(visual))
+ {
+ _mainWindow.inkCanvas.Children.Remove(visual);
+ }
+
+ RemoveStroke(stroke);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"渐隐动画完成后清理墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ };
+
+ visual.BeginAnimation(UIElement.OpacityProperty, fadeAnimation);
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"开始渐隐动画失败: {ex}", LogHelper.LogType.Error);
+ }
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs
index 6fe95e2c..5bf4b636 100644
--- a/Ink Canvas/Helpers/PPTUIManager.cs
+++ b/Ink Canvas/Helpers/PPTUIManager.cs
@@ -3,7 +3,6 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
-using Ink_Canvas.Helpers;
namespace Ink_Canvas.Helpers
{
diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs
index 31bc55a5..14a0ff8d 100644
--- a/Ink Canvas/MainWindow.xaml.cs
+++ b/Ink Canvas/MainWindow.xaml.cs
@@ -41,6 +41,9 @@ namespace Ink_Canvas
private int currentPageIndex;
private System.Windows.Controls.Canvas currentCanvas;
private AutoUpdateHelper.UpdateLineGroup AvailableLatestLineGroup;
+
+ // 全局快捷键管理器
+ private GlobalHotkeyManager _globalHotkeyManager;
@@ -495,6 +498,9 @@ namespace Ink_Canvas
// 初始化剪贴板监控
InitializeClipboardMonitoring();
+
+ // 初始化全局快捷键管理器
+ InitializeGlobalHotkeyManager();
}
private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e)
@@ -623,6 +629,13 @@ namespace Ink_Canvas
// 清理剪贴板监控
CleanupClipboardMonitoring();
ClipboardNotification.Stop();
+
+ // 清理全局快捷键管理器
+ if (_globalHotkeyManager != null)
+ {
+ _globalHotkeyManager.Dispose();
+ _globalHotkeyManager = null;
+ }
// 停止置顶维护定时器
StopTopmostMaintenance();
@@ -1067,10 +1080,7 @@ namespace Ink_Canvas
// 新增:快捷键设置
private void NavShortcuts_Click(object sender, RoutedEventArgs e)
{
- // 切换到快捷键设置页面
- ShowSettingsSection("shortcuts");
- // 如果设置部分尚未快捷键
- MessageBox.Show("设置功能正在开发中", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
+ OpenHotkeySettingsWindow();
}
private void BtnCloseSettings_Click(object sender, RoutedEventArgs e)
@@ -1955,5 +1965,46 @@ namespace Ink_Canvas
}
#endregion
+
+ #region 全局快捷键管理
+ ///
+ /// 初始化全局快捷键管理器
+ ///
+ private void InitializeGlobalHotkeyManager()
+ {
+ try
+ {
+ _globalHotkeyManager = new GlobalHotkeyManager(this);
+ _globalHotkeyManager.LoadHotkeysFromSettings();
+ LogHelper.WriteLogToFile("全局快捷键管理器已初始化", LogHelper.LogType.Event);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"初始化全局快捷键管理器时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 打开快捷键设置窗口
+ ///
+ private void OpenHotkeySettingsWindow()
+ {
+ try
+ {
+ if (_globalHotkeyManager == null)
+ {
+ MessageBox.Show("快捷键管理器尚未初始化,请稍后重试。", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+ var hotkeySettingsWindow = new HotkeySettingsWindow(this, _globalHotkeyManager);
+ hotkeySettingsWindow.ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"打开快捷键设置窗口时出错: {ex.Message}", LogHelper.LogType.Error);
+ MessageBox.Show($"打开快捷键设置窗口时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ #endregion
}
}
diff --git a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
index de6b9ba3..ee4a6152 100644
--- a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
+++ b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
@@ -185,7 +185,7 @@ namespace Ink_Canvas
}
// 处理全局粘贴快捷键
- private async void HandleGlobalPaste(object sender, ExecutedRoutedEventArgs e)
+ internal async void HandleGlobalPaste(object sender, ExecutedRoutedEventArgs e)
{
try
{
diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
index edd67c3d..67f0ec06 100644
--- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
+++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
@@ -186,7 +186,7 @@ namespace Ink_Canvas
GridForFloatingBarDraging.Visibility = Visibility.Visible;
}
- private void SymbolIconEmoji_MouseUp(object sender, MouseButtonEventArgs e)
+ internal void SymbolIconEmoji_MouseUp(object sender, MouseButtonEventArgs e)
{
isDragDropInEffect = false;
@@ -495,7 +495,8 @@ namespace Ink_Canvas
#endregion
#region 撤銷重做按鈕
- private void SymbolIconUndo_MouseUp(object sender, MouseButtonEventArgs e)
+
+ internal void SymbolIconUndo_MouseUp(object sender, MouseButtonEventArgs e)
{
//if (lastBorderMouseDownObject != sender) return;
@@ -508,7 +509,7 @@ namespace Ink_Canvas
HideSubPanels();
}
- private void SymbolIconRedo_MouseUp(object sender, MouseButtonEventArgs e)
+ internal void SymbolIconRedo_MouseUp(object sender, MouseButtonEventArgs e)
{
//if (lastBorderMouseDownObject != sender) return;
@@ -528,7 +529,7 @@ namespace Ink_Canvas
//private bool Not_Enter_Blackboard_fir_Mouse_Click = true;
private bool isDisplayingOrHidingBlackboard;
- private void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e)
+ internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel)
@@ -728,7 +729,7 @@ namespace Ink_Canvas
#region 清空畫布按鈕
- private void SymbolIconDelete_MouseUp(object sender, MouseButtonEventArgs e)
+ internal void SymbolIconDelete_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel)
@@ -778,7 +779,7 @@ namespace Ink_Canvas
///
/// sender
/// MouseButtonEventArgs
- private void SymbolIconSelect_MouseUp(object sender, MouseButtonEventArgs e)
+ internal void SymbolIconSelect_MouseUp(object sender, MouseButtonEventArgs e)
{
if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel)
@@ -1542,7 +1543,7 @@ namespace Ink_Canvas
});
}
- private async void CursorIcon_Click(object sender, RoutedEventArgs e)
+ internal async void CursorIcon_Click(object sender, RoutedEventArgs e)
{
if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel)
((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent);
@@ -1648,7 +1649,7 @@ namespace Ink_Canvas
}
}
- private void PenIcon_Click(object sender, RoutedEventArgs e)
+ internal void PenIcon_Click(object sender, RoutedEventArgs e)
{
if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel)
@@ -1866,7 +1867,7 @@ namespace Ink_Canvas
CheckColorTheme();
}
- private void EraserIcon_Click(object sender, RoutedEventArgs e)
+ internal void EraserIcon_Click(object sender, RoutedEventArgs e)
{
EnterMultiTouchModeIfNeeded();
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
diff --git a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs
index 594d3a21..79ef9e5f 100644
--- a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs
@@ -57,7 +57,7 @@ namespace Ink_Canvas
}
- private void KeyExit(object sender, ExecutedRoutedEventArgs e)
+ internal void KeyExit(object sender, ExecutedRoutedEventArgs e)
{
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible) BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null);
}
diff --git a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
index 38b40348..00e537fd 100644
--- a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
@@ -42,7 +42,7 @@ namespace Ink_Canvas
SaveInkCanvasStrokes(false);
}
- private void SaveScreenShotToDesktop()
+ internal void SaveScreenShotToDesktop()
{
var desktopPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs
index 9e520900..fdaf44ba 100644
--- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs
+++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs
@@ -172,8 +172,8 @@ namespace Ink_Canvas
return Task.FromResult(true);
}
-
- private async void BtnDrawLine_Click(object sender, MouseButtonEventArgs e)
+
+ internal async void BtnDrawLine_Click(object sender, MouseButtonEventArgs e)
{
await CheckIsDrawingShapesInMultiTouchMode();
EnterShapeDrawingMode(1);
diff --git a/Ink Canvas/Windows/HotkeyItem.xaml b/Ink Canvas/Windows/HotkeyItem.xaml
new file mode 100644
index 00000000..a7ebf536
--- /dev/null
+++ b/Ink Canvas/Windows/HotkeyItem.xaml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Ink Canvas/Windows/HotkeyItem.xaml.cs b/Ink Canvas/Windows/HotkeyItem.xaml.cs
new file mode 100644
index 00000000..3ff70c8c
--- /dev/null
+++ b/Ink Canvas/Windows/HotkeyItem.xaml.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+
+namespace Ink_Canvas.Windows
+{
+ ///
+ /// 快捷键项控件
+ ///
+ public partial class HotkeyItem : UserControl
+ {
+ #region Events
+ ///
+ /// 快捷键变更事件
+ ///
+ public event EventHandler HotkeyChanged;
+ #endregion
+
+ #region Properties
+ public string Title
+ {
+ get => TitleTextBlock.Text;
+ set => TitleTextBlock.Text = value;
+ }
+
+ public string Description
+ {
+ get => DescriptionTextBlock.Text;
+ set => DescriptionTextBlock.Text = value;
+ }
+
+ public string DefaultKey { get; set; }
+ public string DefaultModifiers { get; set; }
+
+ private Key _currentKey = Key.None;
+ private ModifierKeys _currentModifiers = ModifierKeys.None;
+ #endregion
+
+ #region Constructor
+ public HotkeyItem()
+ {
+ InitializeComponent();
+ UpdateHotkeyDisplay();
+ }
+ #endregion
+
+ #region Public Methods
+ ///
+ /// 设置当前快捷键
+ ///
+ /// 按键
+ /// 修饰键
+ public void SetCurrentHotkey(Key key, ModifierKeys modifiers)
+ {
+ _currentKey = key;
+ _currentModifiers = modifiers;
+ UpdateHotkeyDisplay();
+ }
+
+ ///
+ /// 获取当前快捷键
+ ///
+ /// 快捷键信息
+ public (Key key, ModifierKeys modifiers) GetCurrentHotkey()
+ {
+ return (_currentKey, _currentModifiers);
+ }
+ #endregion
+
+ #region Private Methods
+ private void UpdateHotkeyDisplay()
+ {
+ if (_currentKey == Key.None)
+ {
+ CurrentHotkeyTextBlock.Text = "未设置";
+ CurrentHotkeyTextBlock.Foreground = System.Windows.Media.Brushes.Gray;
+ }
+ else
+ {
+ var modifiersText = _currentModifiers == ModifierKeys.None ? "" : $"{_currentModifiers}+";
+ CurrentHotkeyTextBlock.Text = $"{modifiersText}{_currentKey}";
+ CurrentHotkeyTextBlock.Foreground = System.Windows.Media.Brushes.Black;
+ }
+ }
+
+ private void StartHotkeyCapture()
+ {
+ BtnSetHotkey.Content = "请按键...";
+ BtnSetHotkey.Background = System.Windows.Media.Brushes.Orange;
+
+ // 设置焦点以捕获键盘事件
+ Focus();
+
+ // 添加键盘事件处理器
+ KeyDown += HotkeyItem_KeyDown;
+ KeyUp += HotkeyItem_KeyUp;
+ }
+
+ private void StopHotkeyCapture()
+ {
+ BtnSetHotkey.Content = "设置";
+ BtnSetHotkey.Background = System.Windows.Media.Brushes.DodgerBlue;
+
+ // 移除键盘事件处理器
+ KeyDown -= HotkeyItem_KeyDown;
+ KeyUp -= HotkeyItem_KeyUp;
+ }
+
+ private void HotkeyItem_KeyDown(object sender, KeyEventArgs e)
+ {
+ e.Handled = true;
+
+ // 忽略某些特殊键
+ if (e.Key == Key.LeftShift || e.Key == Key.RightShift ||
+ e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl ||
+ e.Key == Key.LeftAlt || e.Key == Key.RightAlt ||
+ e.Key == Key.LWin || e.Key == Key.RWin)
+ {
+ return;
+ }
+
+ // 获取修饰键
+ var modifiers = ModifierKeys.None;
+ if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
+ modifiers |= ModifierKeys.Control;
+ if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
+ modifiers |= ModifierKeys.Shift;
+ if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
+ modifiers |= ModifierKeys.Alt;
+ if (Keyboard.IsKeyDown(Key.LWin) || Keyboard.IsKeyDown(Key.RWin))
+ modifiers |= ModifierKeys.Windows;
+
+ // 设置新的快捷键
+ var oldKey = _currentKey;
+ var oldModifiers = _currentModifiers;
+
+ _currentKey = e.Key;
+ _currentModifiers = modifiers;
+
+ UpdateHotkeyDisplay();
+ StopHotkeyCapture();
+
+ // 触发快捷键变更事件
+ HotkeyChanged?.Invoke(this, new HotkeyChangedEventArgs
+ {
+ HotkeyName = Title,
+ Key = _currentKey,
+ Modifiers = _currentModifiers
+ });
+ }
+
+ private void HotkeyItem_KeyUp(object sender, KeyEventArgs e)
+ {
+ e.Handled = true;
+ }
+ #endregion
+
+ #region Event Handlers
+ private void BtnSetHotkey_Click(object sender, RoutedEventArgs e)
+ {
+ StartHotkeyCapture();
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Ink Canvas/Windows/HotkeySettingsWindow.xaml b/Ink Canvas/Windows/HotkeySettingsWindow.xaml
new file mode 100644
index 00000000..68bde7dc
--- /dev/null
+++ b/Ink Canvas/Windows/HotkeySettingsWindow.xaml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs b/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs
new file mode 100644
index 00000000..453122cb
--- /dev/null
+++ b/Ink Canvas/Windows/HotkeySettingsWindow.xaml.cs
@@ -0,0 +1,357 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Input;
+using Ink_Canvas.Helpers;
+
+namespace Ink_Canvas.Windows
+{
+ ///
+ /// 快捷键设置窗口
+ ///
+ public partial class HotkeySettingsWindow : Window
+ {
+ #region Private Fields
+ private readonly MainWindow _mainWindow;
+ private readonly GlobalHotkeyManager _hotkeyManager;
+ private readonly Dictionary _hotkeyItems;
+ #endregion
+
+ #region Constructor
+ public HotkeySettingsWindow(MainWindow mainWindow, GlobalHotkeyManager hotkeyManager)
+ {
+ InitializeComponent();
+ _mainWindow = mainWindow;
+ _hotkeyManager = hotkeyManager;
+ _hotkeyItems = new Dictionary();
+
+ // 隐藏主窗口的设置页面
+ HideMainWindowSettings();
+ InitializeHotkeyItems();
+ LoadCurrentHotkeys();
+ SetupEventHandlers();
+
+ // 注册窗口关闭事件
+ this.Closed += HotkeySettingsWindow_Closed;
+ }
+ #endregion
+
+ #region Private Methods
+ private void InitializeHotkeyItems()
+ {
+ // 初始化快捷键项
+ _hotkeyItems["Undo"] = UndoHotkey;
+ _hotkeyItems["Redo"] = RedoHotkey;
+ _hotkeyItems["Clear"] = ClearHotkey;
+ _hotkeyItems["Paste"] = PasteHotkey;
+ _hotkeyItems["SelectTool"] = SelectToolHotkey;
+ _hotkeyItems["DrawTool"] = DrawToolHotkey;
+ _hotkeyItems["EraserTool"] = EraserToolHotkey;
+ _hotkeyItems["BlackboardTool"] = BlackboardToolHotkey;
+ _hotkeyItems["QuitDrawTool"] = QuitDrawToolHotkey;
+ _hotkeyItems["Pen1"] = Pen1Hotkey;
+ _hotkeyItems["Pen2"] = Pen2Hotkey;
+ _hotkeyItems["Pen3"] = Pen3Hotkey;
+ _hotkeyItems["Pen4"] = Pen4Hotkey;
+ _hotkeyItems["Pen5"] = Pen5Hotkey;
+ _hotkeyItems["DrawLine"] = DrawLineHotkey;
+ _hotkeyItems["Screenshot"] = ScreenshotHotkey;
+ _hotkeyItems["Hide"] = HideHotkey;
+ _hotkeyItems["Exit"] = ExitHotkey;
+ }
+
+ private void LoadCurrentHotkeys()
+ {
+ try
+ {
+ var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys();
+ foreach (var hotkey in registeredHotkeys)
+ {
+ if (_hotkeyItems.TryGetValue(hotkey.Name, out var hotkeyItem))
+ {
+ hotkeyItem.SetCurrentHotkey(hotkey.Key, hotkey.Modifiers);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"加载当前快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ private void SetupEventHandlers()
+ {
+ // 为每个快捷键项设置事件处理器
+ foreach (var hotkeyItem in _hotkeyItems.Values)
+ {
+ hotkeyItem.HotkeyChanged += OnHotkeyChanged;
+ }
+ }
+
+ private void OnHotkeyChanged(object sender, HotkeyChangedEventArgs e)
+ {
+ try
+ {
+ // 检查快捷键冲突
+ if (IsHotkeyConflict(e.Key, e.Modifiers, e.HotkeyName))
+ {
+ MessageBox.Show($"快捷键 {e.Modifiers}+{e.Key} 已被其他功能使用,请选择其他组合。",
+ "快捷键冲突", MessageBoxButton.OK, MessageBoxImage.Warning);
+ return;
+ }
+
+ // 更新快捷键管理器
+ UpdateHotkeyInManager(e.HotkeyName, e.Key, e.Modifiers);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"处理快捷键变更时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ private bool IsHotkeyConflict(Key key, ModifierKeys modifiers, string excludeHotkeyName)
+ {
+ var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys();
+ foreach (var hotkey in registeredHotkeys)
+ {
+ if (hotkey.Name != excludeHotkeyName &&
+ hotkey.Key == key &&
+ hotkey.Modifiers == modifiers)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void UpdateHotkeyInManager(string hotkeyName, Key key, ModifierKeys modifiers)
+ {
+ try
+ {
+ // 根据快捷键名称获取对应的动作
+ var action = GetActionForHotkey(hotkeyName);
+ if (action != null)
+ {
+ _hotkeyManager.RegisterHotkey(hotkeyName, key, modifiers, action);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"更新快捷键管理器时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ private Action GetActionForHotkey(string hotkeyName)
+ {
+ switch (hotkeyName)
+ {
+ case "Undo":
+ return () => _mainWindow.SymbolIconUndo_MouseUp(null, null);
+ case "Redo":
+ return () => _mainWindow.SymbolIconRedo_MouseUp(null, null);
+ case "Clear":
+ return () => _mainWindow.SymbolIconDelete_MouseUp(null, null);
+ case "Paste":
+ return () => _mainWindow.HandleGlobalPaste(null, null);
+ case "SelectTool":
+ return () => _mainWindow.SymbolIconSelect_MouseUp(null, null);
+ case "DrawTool":
+ return () => _mainWindow.PenIcon_Click(null, null);
+ case "EraserTool":
+ return () => _mainWindow.EraserIcon_Click(null, null);
+ case "BlackboardTool":
+ return () => _mainWindow.ImageBlackboard_MouseUp(null, null);
+ case "QuitDrawTool":
+ return () => _mainWindow.CursorIcon_Click(null, null);
+ case "Pen1":
+ return () => SwitchToPenType(0);
+ case "Pen2":
+ return () => SwitchToPenType(1);
+ case "Pen3":
+ return () => SwitchToPenType(2);
+ case "Pen4":
+ return () => SwitchToPenType(3);
+ case "Pen5":
+ return () => SwitchToPenType(4);
+ case "DrawLine":
+ return () => _mainWindow.BtnDrawLine_Click(null, null);
+ case "Screenshot":
+ return () => _mainWindow.SaveScreenShotToDesktop();
+ case "Hide":
+ return () => _mainWindow.SymbolIconEmoji_MouseUp(null, null);
+ case "Exit":
+ return () => _mainWindow.KeyExit(null, null);
+ default:
+ return null;
+ }
+ }
+
+ ///
+ /// 切换到指定笔类型
+ ///
+ /// 笔类型索引
+ private void SwitchToPenType(int penTypeIndex)
+ {
+ try
+ {
+ // 通过反射访问主窗口的penType字段
+ var penTypeField = _mainWindow.GetType().GetField("penType",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ if (penTypeField != null)
+ {
+ penTypeField.SetValue(_mainWindow, penTypeIndex);
+
+ // 调用CheckPenTypeUIState方法更新UI状态
+ var checkPenTypeMethod = _mainWindow.GetType().GetMethod("CheckPenTypeUIState",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ if (checkPenTypeMethod != null)
+ {
+ checkPenTypeMethod.Invoke(_mainWindow, null);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"切换到笔类型{penTypeIndex}时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ #endregion
+
+ #region MainWindow Settings Management
+ ///
+ /// 隐藏主窗口的设置页面
+ ///
+ private void HideMainWindowSettings()
+ {
+ try
+ {
+ // 通过反射访问主窗口的设置面板
+ var settingsBorder = _mainWindow.GetType().GetField("BorderSettings",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
+
+ if (settingsBorder != null)
+ {
+ settingsBorder.Visibility = System.Windows.Visibility.Collapsed;
+ }
+
+ // 隐藏设置蒙版
+ var settingsMask = _mainWindow.GetType().GetField("BorderSettingsMask",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
+
+ if (settingsMask != null)
+ {
+ settingsMask.Visibility = System.Windows.Visibility.Collapsed;
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"隐藏主窗口设置页面时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 显示主窗口的设置页面
+ ///
+ private void ShowMainWindowSettings()
+ {
+ try
+ {
+ // 通过反射访问主窗口的设置面板
+ var settingsBorder = _mainWindow.GetType().GetField("BorderSettings",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
+
+ if (settingsBorder != null)
+ {
+ settingsBorder.Visibility = System.Windows.Visibility.Visible;
+ }
+
+ // 显示设置蒙版
+ var settingsMask = _mainWindow.GetType().GetField("BorderSettingsMask",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
+
+ if (settingsMask != null)
+ {
+ settingsMask.Visibility = System.Windows.Visibility.Visible;
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"显示主窗口设置页面时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ #endregion
+
+ #region Window Event Handlers
+ ///
+ /// 窗口关闭事件处理
+ ///
+ private void HotkeySettingsWindow_Closed(object sender, EventArgs e)
+ {
+ // 恢复主窗口设置页面的显示
+ ShowMainWindowSettings();
+ }
+ #endregion
+
+ #region Event Handlers
+ private void BtnClose_Click(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void BtnResetToDefault_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ var result = MessageBox.Show("确定要重置所有快捷键为默认设置吗?",
+ "确认重置", MessageBoxButton.YesNo, MessageBoxImage.Question);
+ if (result == MessageBoxResult.Yes)
+ {
+ // 重置为默认快捷键
+ _hotkeyManager.RegisterDefaultHotkeys();
+
+ // 更新UI显示
+ LoadCurrentHotkeys();
+
+ MessageBox.Show("快捷键已重置为默认设置。", "重置完成", MessageBoxButton.OK, MessageBoxImage.Information);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"重置快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
+ MessageBox.Show($"重置快捷键时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void BtnSave_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ // 保存快捷键配置
+ _hotkeyManager.SaveHotkeysToSettings();
+
+ MessageBox.Show("快捷键设置已保存。", "保存成功", MessageBoxButton.OK, MessageBoxImage.Information);
+ Close();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"保存快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
+ MessageBox.Show($"保存快捷键设置时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ #endregion
+ }
+
+ #region Hotkey Changed Event Args
+ ///
+ /// 快捷键变更事件参数
+ ///
+ public class HotkeyChangedEventArgs : EventArgs
+ {
+ public string HotkeyName { get; set; }
+ public Key Key { get; set; }
+ public ModifierKeys Modifiers { get; set; }
+ }
+ #endregion
+}
\ No newline at end of file