improve:快捷键

This commit is contained in:
2025-08-24 09:09:48 +08:00
parent ff9ce4df44
commit d1eed23399
3 changed files with 257 additions and 116 deletions
+25 -55
View File
@@ -17,11 +17,10 @@ namespace Ink_Canvas.Helpers
private readonly Dictionary<string, HotkeyInfo> _registeredHotkeys; private readonly Dictionary<string, HotkeyInfo> _registeredHotkeys;
private readonly MainWindow _mainWindow; private readonly MainWindow _mainWindow;
private bool _isDisposed = false; 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 HotkeyConfigFile = Path.Combine(App.RootPath, "HotkeyConfig.json");
private static readonly string HotkeyConfigBackupFile = Path.Combine(App.RootPath, "HotkeyConfig.json.bak");
#endregion #endregion
#region Constructor #region Constructor
@@ -212,7 +211,7 @@ namespace Ink_Canvas.Helpers
} }
/// <summary> /// <summary>
/// 从设置加载快捷键配置 /// 从设置加载快捷键
/// </summary> /// </summary>
public void LoadHotkeysFromSettings() public void LoadHotkeysFromSettings()
{ {
@@ -232,20 +231,28 @@ namespace Ink_Canvas.Helpers
{ {
// 成功从配置文件加载快捷键设置 // 成功从配置文件加载快捷键设置
_hotkeysShouldBeRegistered = true; _hotkeysShouldBeRegistered = true;
LogHelper.WriteLogToFile("成功从配置文件加载快捷键设置", LogHelper.LogType.Info);
} }
else else
{ {
// 如果配置文件不存在或加载失败,使用默认快捷键 // 如果配置文件不存在,使用默认快捷键
RegisterDefaultHotkeys(); if (!File.Exists(HotkeyConfigFile))
_hotkeysShouldBeRegistered = true; {
LogHelper.WriteLogToFile("配置文件不存在,注册默认快捷键", LogHelper.LogType.Info);
RegisterDefaultHotkeys();
_hotkeysShouldBeRegistered = true;
}
else
{
LogHelper.WriteLogToFile("配置文件存在但加载失败,保持当前状态", LogHelper.LogType.Warning);
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
// 出错时使用默认快捷键 LogHelper.WriteLogToFile($"从设置加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error);
RegisterDefaultHotkeys(); // 出错时不自动使用默认快捷键,保持当前状态
_hotkeysShouldBeRegistered = true; }
}
} }
/// <summary> /// <summary>
@@ -283,18 +290,14 @@ namespace Ink_Canvas.Helpers
if (!_hotkeysShouldBeRegistered) if (!_hotkeysShouldBeRegistered)
{ {
_hotkeysShouldBeRegistered = true; _hotkeysShouldBeRegistered = true;
LogHelper.WriteLogToFile("启用快捷键注册功能", LogHelper.LogType.Info);
// 如果当前不在鼠标模式下,立即注册快捷键 // 立即加载快捷键设置
var currentIsMouseMode = IsInSelectMode(); LoadHotkeysFromSettings();
if (!currentIsMouseMode)
{
LoadHotkeysFromSettings();
}
} }
else else
{ {
// 快捷键注册功能已经启用 LogHelper.WriteLogToFile("快捷键注册功能已经启用", LogHelper.LogType.Info);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -445,29 +448,6 @@ namespace Ink_Canvas.Helpers
catch (Exception ex) catch (Exception ex)
{ {
LogHelper.WriteLogToFile($"从配置文件加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error); 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<HotkeyConfig>(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; return false;
} }
} }
@@ -514,18 +494,8 @@ namespace Ink_Canvas.Helpers
string jsonContent = JsonConvert.SerializeObject(config, settings); string jsonContent = JsonConvert.SerializeObject(config, settings);
// 先写入临时文件,然后替换原文件(原子操作) // 直接写入原文件,覆盖原有内容
string tempFile = HotkeyConfigFile + ".temp"; File.WriteAllText(HotkeyConfigFile, jsonContent, System.Text.Encoding.UTF8);
File.WriteAllText(tempFile, jsonContent, System.Text.Encoding.UTF8);
// 如果原文件存在,先备份
if (File.Exists(HotkeyConfigFile))
{
File.Copy(HotkeyConfigFile, HotkeyConfigBackupFile, true);
}
// 替换原文件
File.Move(tempFile, HotkeyConfigFile);
LogHelper.WriteLogToFile($"快捷键配置已保存到: {HotkeyConfigFile}", LogHelper.LogType.Event); LogHelper.WriteLogToFile($"快捷键配置已保存到: {HotkeyConfigFile}", LogHelper.LogType.Event);
return true; return true;
+14 -2
View File
@@ -2016,8 +2016,8 @@ namespace Ink_Canvas
try try
{ {
_globalHotkeyManager = new GlobalHotkeyManager(this); _globalHotkeyManager = new GlobalHotkeyManager(this);
_globalHotkeyManager.LoadHotkeysFromSettings(); // 不在这里加载快捷键,等待需要时再加载
LogHelper.WriteLogToFile("全局快捷键管理器已初始化", LogHelper.LogType.Event); LogHelper.WriteLogToFile("全局快捷键管理器已初始化(未加载快捷键)", LogHelper.LogType.Event);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -2064,6 +2064,12 @@ namespace Ink_Canvas
{ {
ToggleSwitchInkFadeInPanel.IsOn = Settings.Canvas.EnableInkFade; ToggleSwitchInkFadeInPanel.IsOn = Settings.Canvas.EnableInkFade;
} }
// 同步普通画笔面板中的开关状态
if (ToggleSwitchInkFadeInPanel2 != null)
{
ToggleSwitchInkFadeInPanel2.IsOn = Settings.Canvas.EnableInkFade;
}
LogHelper.WriteLogToFile($"墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "" : "")}", LogHelper.LogType.Event); LogHelper.WriteLogToFile($"墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "" : "")}", LogHelper.LogType.Event);
} }
@@ -2107,6 +2113,12 @@ namespace Ink_Canvas
{ {
ToggleSwitchEnableInkFade.IsOn = Settings.Canvas.EnableInkFade; ToggleSwitchEnableInkFade.IsOn = Settings.Canvas.EnableInkFade;
} }
// 同步普通画笔面板中的开关状态
if (ToggleSwitchInkFadeInPanel2 != null)
{
ToggleSwitchInkFadeInPanel2.IsOn = Settings.Canvas.EnableInkFade;
}
LogHelper.WriteLogToFile($"批注子面板中墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "" : "")}", LogHelper.LogType.Event); LogHelper.WriteLogToFile($"批注子面板中墨迹渐隐功能已{(Settings.Canvas.EnableInkFade ? "" : "")}", LogHelper.LogType.Event);
} }
+218 -59
View File
@@ -28,8 +28,22 @@ namespace Ink_Canvas.Windows
// 隐藏主窗口的设置页面 // 隐藏主窗口的设置页面
HideMainWindowSettings(); HideMainWindowSettings();
InitializeHotkeyItems(); InitializeHotkeyItems();
LoadCurrentHotkeys();
SetupEventHandlers(); // 延迟加载快捷键,确保快捷键管理器已完全初始化
this.Loaded += (s, e) =>
{
try
{
// 不自动启用快捷键注册功能,让用户手动决定
// 只加载当前已注册的快捷键
LoadCurrentHotkeys();
SetupEventHandlers();
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"快捷键设置窗口初始化时出错: {ex.Message}", LogHelper.LogType.Error);
}
};
// 注册窗口关闭事件 // 注册窗口关闭事件
this.Closed += HotkeySettingsWindow_Closed; this.Closed += HotkeySettingsWindow_Closed;
@@ -39,60 +53,71 @@ namespace Ink_Canvas.Windows
#region Private Methods #region Private Methods
private void InitializeHotkeyItems() private void InitializeHotkeyItems()
{ {
// 初始化快捷键项并设置HotkeyName try
_hotkeyItems["Undo"] = UndoHotkey; {
UndoHotkey.HotkeyName = "Undo"; LogHelper.WriteLogToFile("开始初始化快捷键项", LogHelper.LogType.Info);
_hotkeyItems["Redo"] = RedoHotkey; // 初始化快捷键项并设置HotkeyName
RedoHotkey.HotkeyName = "Redo"; _hotkeyItems["Undo"] = UndoHotkey;
UndoHotkey.HotkeyName = "Undo";
_hotkeyItems["Clear"] = ClearHotkey;
ClearHotkey.HotkeyName = "Clear"; _hotkeyItems["Redo"] = RedoHotkey;
RedoHotkey.HotkeyName = "Redo";
_hotkeyItems["Paste"] = PasteHotkey;
PasteHotkey.HotkeyName = "Paste"; _hotkeyItems["Clear"] = ClearHotkey;
ClearHotkey.HotkeyName = "Clear";
_hotkeyItems["SelectTool"] = SelectToolHotkey;
SelectToolHotkey.HotkeyName = "SelectTool"; _hotkeyItems["Paste"] = PasteHotkey;
PasteHotkey.HotkeyName = "Paste";
_hotkeyItems["DrawTool"] = DrawToolHotkey;
DrawToolHotkey.HotkeyName = "DrawTool"; _hotkeyItems["SelectTool"] = SelectToolHotkey;
SelectToolHotkey.HotkeyName = "SelectTool";
_hotkeyItems["EraserTool"] = EraserToolHotkey;
EraserToolHotkey.HotkeyName = "EraserTool"; _hotkeyItems["DrawTool"] = DrawToolHotkey;
DrawToolHotkey.HotkeyName = "DrawTool";
_hotkeyItems["BlackboardTool"] = BlackboardToolHotkey;
BlackboardToolHotkey.HotkeyName = "BlackboardTool"; _hotkeyItems["EraserTool"] = EraserToolHotkey;
EraserToolHotkey.HotkeyName = "EraserTool";
_hotkeyItems["QuitDrawTool"] = QuitDrawToolHotkey;
QuitDrawToolHotkey.HotkeyName = "QuitDrawTool"; _hotkeyItems["BlackboardTool"] = BlackboardToolHotkey;
BlackboardToolHotkey.HotkeyName = "BlackboardTool";
_hotkeyItems["Pen1"] = Pen1Hotkey;
Pen1Hotkey.HotkeyName = "Pen1"; _hotkeyItems["QuitDrawTool"] = QuitDrawToolHotkey;
QuitDrawToolHotkey.HotkeyName = "QuitDrawTool";
_hotkeyItems["Pen2"] = Pen2Hotkey;
Pen2Hotkey.HotkeyName = "Pen2"; _hotkeyItems["Pen1"] = Pen1Hotkey;
Pen1Hotkey.HotkeyName = "Pen1";
_hotkeyItems["Pen3"] = Pen3Hotkey;
Pen3Hotkey.HotkeyName = "Pen3"; _hotkeyItems["Pen2"] = Pen2Hotkey;
Pen2Hotkey.HotkeyName = "Pen2";
_hotkeyItems["Pen4"] = Pen4Hotkey;
Pen4Hotkey.HotkeyName = "Pen4"; _hotkeyItems["Pen3"] = Pen3Hotkey;
Pen3Hotkey.HotkeyName = "Pen3";
_hotkeyItems["Pen5"] = Pen5Hotkey;
Pen5Hotkey.HotkeyName = "Pen5"; _hotkeyItems["Pen4"] = Pen4Hotkey;
Pen4Hotkey.HotkeyName = "Pen4";
_hotkeyItems["DrawLine"] = DrawLineHotkey;
DrawLineHotkey.HotkeyName = "DrawLine"; _hotkeyItems["Pen5"] = Pen5Hotkey;
Pen5Hotkey.HotkeyName = "Pen5";
_hotkeyItems["Screenshot"] = ScreenshotHotkey;
ScreenshotHotkey.HotkeyName = "Screenshot"; _hotkeyItems["DrawLine"] = DrawLineHotkey;
DrawLineHotkey.HotkeyName = "DrawLine";
_hotkeyItems["Hide"] = HideHotkey;
HideHotkey.HotkeyName = "Hide"; _hotkeyItems["Screenshot"] = ScreenshotHotkey;
ScreenshotHotkey.HotkeyName = "Screenshot";
_hotkeyItems["Exit"] = ExitHotkey;
ExitHotkey.HotkeyName = "Exit"; _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() private void LoadCurrentHotkeys()
@@ -100,13 +125,21 @@ namespace Ink_Canvas.Windows
try try
{ {
var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys(); var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys();
LogHelper.WriteLogToFile($"当前已注册快捷键数量: {registeredHotkeys.Count}", LogHelper.LogType.Info);
// 显示已注册的快捷键
foreach (var hotkey in registeredHotkeys) foreach (var hotkey in registeredHotkeys)
{ {
if (_hotkeyItems.TryGetValue(hotkey.Name, out var hotkeyItem)) if (_hotkeyItems.TryGetValue(hotkey.Name, out var hotkeyItem))
{ {
hotkeyItem.SetCurrentHotkey(hotkey.Key, hotkey.Modifiers); 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) catch (Exception ex)
{ {
@@ -114,6 +147,78 @@ namespace Ink_Canvas.Windows
} }
} }
/// <summary>
/// 为快捷键项设置默认值
/// </summary>
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() private void SetupEventHandlers()
{ {
// 为每个快捷键项设置事件处理器 // 为每个快捷键项设置事件处理器
@@ -127,6 +232,8 @@ namespace Ink_Canvas.Windows
{ {
try try
{ {
LogHelper.WriteLogToFile($"收到快捷键变更事件: {e.HotkeyName} -> {e.Modifiers}+{e.Key}", LogHelper.LogType.Info);
// 检查快捷键冲突 // 检查快捷键冲突
if (IsHotkeyConflict(e.Key, e.Modifiers, e.HotkeyName)) 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) private bool IsHotkeyConflict(Key key, ModifierKeys modifiers, string excludeHotkeyName)
{ {
// 检查是否与已注册的快捷键冲突
var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys(); var registeredHotkeys = _hotkeyManager.GetRegisteredHotkeys();
foreach (var hotkey in registeredHotkeys) foreach (var hotkey in registeredHotkeys)
{ {
@@ -156,6 +264,29 @@ namespace Ink_Canvas.Windows
return true; 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; return false;
} }
@@ -163,20 +294,42 @@ namespace Ink_Canvas.Windows
{ {
try try
{ {
LogHelper.WriteLogToFile($"开始更新快捷键: {hotkeyName} -> {modifiers}+{key}", LogHelper.LogType.Info);
// 先注销原有的快捷键(如果存在)
_hotkeyManager.UnregisterHotkey(hotkeyName);
LogHelper.WriteLogToFile($"已注销原有快捷键: {hotkeyName}", LogHelper.LogType.Info);
// 根据快捷键名称获取对应的动作 // 根据快捷键名称获取对应的动作
var action = GetActionForHotkey(hotkeyName); var action = GetActionForHotkey(hotkeyName);
if (action != null) if (action != null)
{ {
// 使用快捷键管理器的UpdateHotkey方法,这会自动保存配置 LogHelper.WriteLogToFile($"找到快捷键动作: {hotkeyName}", LogHelper.LogType.Info);
if (_hotkeyManager.UpdateHotkey(hotkeyName, key, modifiers))
// 直接注册新的快捷键
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 else
{ {
LogHelper.WriteLogToFile($"更新快捷键 {hotkeyName} 失败", LogHelper.LogType.Error); LogHelper.WriteLogToFile($"更新快捷键 {hotkeyName} 失败", LogHelper.LogType.Error);
} }
} }
else
{
LogHelper.WriteLogToFile($"未找到快捷键 {hotkeyName} 对应的动作", LogHelper.LogType.Warning);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -351,9 +504,15 @@ namespace Ink_Canvas.Windows
"确认重置", MessageBoxButton.YesNo, MessageBoxImage.Question); "确认重置", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes) if (result == MessageBoxResult.Yes)
{ {
// 先注销所有现有快捷键
_hotkeyManager.UnregisterAllHotkeys();
// 重置为默认快捷键 // 重置为默认快捷键
_hotkeyManager.RegisterDefaultHotkeys(); _hotkeyManager.RegisterDefaultHotkeys();
// 立即保存到配置文件
_hotkeyManager.SaveHotkeysToSettings();
// 更新UI显示 // 更新UI显示
LoadCurrentHotkeys(); LoadCurrentHotkeys();