improve:快捷键

This commit is contained in:
2025-09-06 14:48:36 +08:00
parent d0793c546d
commit 49f268bb62
4 changed files with 70 additions and 307 deletions
+5 -253
View File
@@ -3,7 +3,6 @@ using NHotkey.Wpf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Input;
@@ -20,7 +19,6 @@ namespace Ink_Canvas.Helpers
private readonly MainWindow _mainWindow;
private bool _isDisposed;
private bool _hotkeysShouldBeRegistered = true; // 启动时注册热键
private bool _enableHotkeysInMouseMode = false; // 是否在鼠标模式下启用快捷键
// 配置文件路径
private static readonly string HotkeyConfigFile = Path.Combine(App.RootPath, "HotkeyConfig.json");
@@ -404,16 +402,16 @@ namespace Ink_Canvas.Helpers
{
if (isMouseMode)
{
// 鼠标模式下根据设置决定是否禁用快捷键
if (_enableHotkeysInMouseMode)
// 检查设置中是否允许在鼠标模式下启用快捷键
if (MainWindow.Settings.Appearance.EnableHotkeysInMouseMode)
{
// 如果启用了鼠标模式快捷键,则保持快捷键注册
// 如果设置允许,则在鼠标模式下也启用快捷键
EnableHotkeyRegistration();
LogHelper.WriteLogToFile("切换到鼠标模式,但保持快捷键启用(用户设置)");
LogHelper.WriteLogToFile("切换到鼠标模式,但根据设置保持快捷键启用");
}
else
{
// 如果未启用鼠标模式快捷键,则禁用快捷键以放行键盘操作
// 鼠标模式下禁用快捷键,让键盘操作放行
DisableHotkeyRegistration();
LogHelper.WriteLogToFile("切换到鼠标模式,禁用快捷键以放行键盘操作");
}
@@ -820,251 +818,6 @@ namespace Ink_Canvas.Helpers
}
}
/// <summary>
/// 设置是否在鼠标模式下启用快捷键
/// </summary>
/// <param name="enable">是否启用</param>
public void SetEnableHotkeysInMouseMode(bool enable)
{
try
{
_enableHotkeysInMouseMode = enable;
// 保存到主设置配置文件
SaveMouseModeHotkeySettingToMainConfig();
LogHelper.WriteLogToFile($"设置鼠标模式快捷键开关: {enable}");
// 立即应用设置,如果当前是鼠标模式则重新更新状态
var isCurrentlyMouseMode = IsInSelectMode();
if (isCurrentlyMouseMode)
{
UpdateHotkeyStateForToolMode(true);
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"设置鼠标模式快捷键开关时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 获取是否在鼠标模式下启用快捷键
/// </summary>
/// <returns>是否启用</returns>
public bool GetEnableHotkeysInMouseMode()
{
try
{
// 从主设置配置文件加载设置
LoadMouseModeHotkeySettingFromMainConfig();
return _enableHotkeysInMouseMode;
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"获取鼠标模式快捷键开关时出错: {ex.Message}", LogHelper.LogType.Error);
return false; // 默认关闭
}
}
/// <summary>
/// 从主设置配置文件加载鼠标模式快捷键设置
/// </summary>
private void LoadMouseModeHotkeySettingFromMainConfig()
{
try
{
// 通过反射访问主窗口的Settings属性
var settingsProperty = _mainWindow.GetType().GetProperty("Settings", BindingFlags.Public | BindingFlags.Instance);
if (settingsProperty != null)
{
var settings = settingsProperty.GetValue(_mainWindow);
if (settings != null)
{
// 获取Advanced属性
var advancedProperty = settings.GetType().GetProperty("Advanced");
if (advancedProperty != null)
{
var advanced = advancedProperty.GetValue(settings);
if (advanced != null)
{
// 获取EnableHotkeysInMouseMode属性
var enableHotkeysProperty = advanced.GetType().GetProperty("EnableHotkeysInMouseMode");
if (enableHotkeysProperty != null)
{
var value = enableHotkeysProperty.GetValue(advanced);
if (value is bool boolValue)
{
_enableHotkeysInMouseMode = boolValue;
LogHelper.WriteLogToFile($"从主设置配置文件加载鼠标模式快捷键设置: {_enableHotkeysInMouseMode}");
return;
}
}
}
}
}
}
// 如果无法从主设置加载,使用默认值
_enableHotkeysInMouseMode = false;
LogHelper.WriteLogToFile("无法从主设置配置文件加载鼠标模式快捷键设置,使用默认值: false");
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"从主设置配置文件加载鼠标模式快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
_enableHotkeysInMouseMode = false; // 默认关闭
}
}
/// <summary>
/// 从配置文件加载鼠标模式快捷键设置(旧方法,保留兼容性)
/// </summary>
private void LoadMouseModeHotkeySetting()
{
try
{
if (!File.Exists(HotkeyConfigFile))
{
_enableHotkeysInMouseMode = false; // 默认关闭
return;
}
var json = File.ReadAllText(HotkeyConfigFile, Encoding.UTF8);
var config = JsonConvert.DeserializeObject<HotkeyConfig>(json);
if (config != null)
{
// 查找鼠标模式快捷键设置
var mouseModeSetting = config.Hotkeys?.FirstOrDefault(h => h.Name == "EnableHotkeysInMouseMode");
if (mouseModeSetting != null)
{
_enableHotkeysInMouseMode = mouseModeSetting.EnableHotkeysInMouseMode;
LogHelper.WriteLogToFile($"从配置文件加载鼠标模式快捷键设置: {_enableHotkeysInMouseMode}");
}
else
{
_enableHotkeysInMouseMode = false; // 默认关闭
}
}
else
{
_enableHotkeysInMouseMode = false; // 默认关闭
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"从配置文件加载鼠标模式快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
_enableHotkeysInMouseMode = false; // 默认关闭
}
}
/// <summary>
/// 保存鼠标模式快捷键设置到主设置配置文件
/// </summary>
private void SaveMouseModeHotkeySettingToMainConfig()
{
try
{
// 通过反射访问主窗口的Settings属性
var settingsProperty = _mainWindow.GetType().GetProperty("Settings", BindingFlags.Public | BindingFlags.Instance);
if (settingsProperty != null)
{
var settings = settingsProperty.GetValue(_mainWindow);
if (settings != null)
{
// 获取Advanced属性
var advancedProperty = settings.GetType().GetProperty("Advanced");
if (advancedProperty != null)
{
var advanced = advancedProperty.GetValue(settings);
if (advanced != null)
{
// 设置EnableHotkeysInMouseMode属性
var enableHotkeysProperty = advanced.GetType().GetProperty("EnableHotkeysInMouseMode");
if (enableHotkeysProperty != null)
{
enableHotkeysProperty.SetValue(advanced, _enableHotkeysInMouseMode);
// 触发主窗口的保存设置方法
var saveSettingsMethod = _mainWindow.GetType().GetMethod("SaveSettings", BindingFlags.NonPublic | BindingFlags.Instance);
if (saveSettingsMethod != null)
{
saveSettingsMethod.Invoke(_mainWindow, null);
LogHelper.WriteLogToFile($"保存鼠标模式快捷键设置到主设置配置文件: {_enableHotkeysInMouseMode}");
}
else
{
LogHelper.WriteLogToFile("无法找到SaveSettings方法", LogHelper.LogType.Warning);
}
}
}
}
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"保存鼠标模式快捷键设置到主设置配置文件时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 保存鼠标模式快捷键设置到配置文件(旧方法,保留兼容性)
/// </summary>
private void SaveMouseModeHotkeySetting()
{
try
{
HotkeyConfig config;
if (File.Exists(HotkeyConfigFile))
{
var json = File.ReadAllText(HotkeyConfigFile, Encoding.UTF8);
config = JsonConvert.DeserializeObject<HotkeyConfig>(json) ?? new HotkeyConfig();
}
else
{
config = new HotkeyConfig();
}
// 确保Hotkeys列表存在
if (config.Hotkeys == null)
{
config.Hotkeys = new List<HotkeyConfigItem>();
}
// 查找或创建鼠标模式快捷键设置项
var mouseModeSetting = config.Hotkeys.FirstOrDefault(h => h.Name == "EnableHotkeysInMouseMode");
if (mouseModeSetting == null)
{
mouseModeSetting = new HotkeyConfigItem
{
Name = "EnableHotkeysInMouseMode",
EnableHotkeysInMouseMode = _enableHotkeysInMouseMode
};
config.Hotkeys.Add(mouseModeSetting);
}
else
{
mouseModeSetting.EnableHotkeysInMouseMode = _enableHotkeysInMouseMode;
}
// 更新配置信息
config.Version = "1.0";
config.LastModified = DateTime.Now;
// 保存到文件
var jsonString = JsonConvert.SerializeObject(config, Formatting.Indented);
File.WriteAllText(HotkeyConfigFile, jsonString, Encoding.UTF8);
LogHelper.WriteLogToFile($"保存鼠标模式快捷键设置到配置文件: {_enableHotkeysInMouseMode}");
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"保存鼠标模式快捷键设置到配置文件时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
#endregion
@@ -1115,7 +868,6 @@ namespace Ink_Canvas.Helpers
public string Name { get; set; }
public Key Key { get; set; }
public ModifierKeys Modifiers { get; set; }
public bool EnableHotkeysInMouseMode { get; set; }
}
#endregion
}
+3 -3
View File
@@ -233,6 +233,9 @@ namespace Ink_Canvas
[JsonProperty("quickColorPaletteDisplayMode")]
public int QuickColorPaletteDisplayMode { get; set; } = 1;
[JsonProperty("enableHotkeysInMouseMode")]
public bool EnableHotkeysInMouseMode { get; set; } = false;
}
public class PowerPointSettings
@@ -498,9 +501,6 @@ namespace Ink_Canvas
[JsonProperty("isEnableAvoidFullScreenHelper")]
public bool IsEnableAvoidFullScreenHelper { get; set; }
[JsonProperty("enableHotkeysInMouseMode")]
public bool EnableHotkeysInMouseMode { get; set; } = false;
[JsonProperty("isAutoBackupBeforeUpdate")]
public bool IsAutoBackupBeforeUpdate { get; set; } = true;
+10 -8
View File
@@ -52,14 +52,16 @@
<!-- 鼠标模式快捷键设置 -->
<GroupBox Header="鼠标模式设置" Margin="0,0,0,20">
<ui:SimpleStackPanel>
<ui:ToggleSwitch x:Name="EnableHotkeysInMouseModeToggle"
Header="在鼠标模式下启用快捷键"
Margin="0,0,0,10"/>
<TextBlock Text="开启后,即使在鼠标模式(选择模式)下,快捷键仍然有效。关闭后,鼠标模式下将禁用快捷键以放行键盘操作。"
TextWrapping="Wrap"
Margin="0,0,0,10"
Foreground="#666666"
FontSize="12"/>
<ui:SimpleStackPanel Orientation="Horizontal" VerticalAlignment="Center">
<ui:ToggleSwitch x:Name="ToggleSwitchEnableHotkeysInMouseMode"
Header="在鼠标模式下启用快捷键"
Margin="0,0,10,0"
Width="200"/>
</ui:SimpleStackPanel>
<TextBlock Text="开启后,即使在鼠标模式下快捷键也会生效"
Foreground="#666666"
VerticalAlignment="Center"
TextWrapping="Wrap"/>
</ui:SimpleStackPanel>
</GroupBox>
+52 -43
View File
@@ -42,6 +42,9 @@ namespace Ink_Canvas.Windows
// 加载当前快捷键(包括配置文件中的)
LoadCurrentHotkeys();
SetupEventHandlers();
// 初始化鼠标模式快捷键设置
InitializeMouseModeSettings();
}
catch (Exception ex)
{
@@ -153,9 +156,6 @@ namespace Ink_Canvas.Windows
LogHelper.WriteLogToFile($"设置默认显示值: {hotkeyItem.HotkeyName}");
}
}
// 加载鼠标模式快捷键设置
LoadMouseModeHotkeySetting();
}
catch (Exception ex)
{
@@ -242,9 +242,56 @@ namespace Ink_Canvas.Windows
{
hotkeyItem.HotkeyChanged += OnHotkeyChanged;
}
}
// 为鼠标模式快捷键开关设置事件处理器
EnableHotkeysInMouseModeToggle.Toggled += EnableHotkeysInMouseModeToggle_Toggled;
/// <summary>
/// 初始化鼠标模式快捷键设置
/// </summary>
private void InitializeMouseModeSettings()
{
try
{
// 设置开关的初始状态
ToggleSwitchEnableHotkeysInMouseMode.IsOn = MainWindow.Settings.Appearance.EnableHotkeysInMouseMode;
// 绑定开关变化事件
ToggleSwitchEnableHotkeysInMouseMode.Toggled += OnMouseModeHotkeyToggleChanged;
LogHelper.WriteLogToFile($"鼠标模式快捷键设置已初始化: {MainWindow.Settings.Appearance.EnableHotkeysInMouseMode}");
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"初始化鼠标模式快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 鼠标模式快捷键开关变化事件处理
/// </summary>
private void OnMouseModeHotkeyToggleChanged(object sender, RoutedEventArgs e)
{
try
{
// 更新设置
MainWindow.Settings.Appearance.EnableHotkeysInMouseMode = ToggleSwitchEnableHotkeysInMouseMode.IsOn;
// 立即保存设置
MainWindow.SaveSettingsToFile();
// 如果快捷键管理器存在,立即更新快捷键状态
if (_hotkeyManager != null)
{
// 检查当前是否处于鼠标模式
bool isCurrentlyMouseMode = _mainWindow.inkCanvas.EditingMode == InkCanvasEditingMode.None;
_hotkeyManager.UpdateHotkeyStateForToolMode(isCurrentlyMouseMode);
}
LogHelper.WriteLogToFile($"鼠标模式快捷键设置已更新: {MainWindow.Settings.Appearance.EnableHotkeysInMouseMode}", LogHelper.LogType.Event);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"更新鼠标模式快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
private void OnHotkeyChanged(object sender, HotkeyChangedEventArgs e)
@@ -561,44 +608,6 @@ namespace Ink_Canvas.Windows
MessageBox.Show($"保存快捷键设置时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
/// <summary>
/// 鼠标模式快捷键开关切换事件
/// </summary>
private void EnableHotkeysInMouseModeToggle_Toggled(object sender, RoutedEventArgs e)
{
try
{
var isEnabled = EnableHotkeysInMouseModeToggle.IsOn;
LogHelper.WriteLogToFile($"鼠标模式快捷键开关状态变更: {isEnabled}");
// 立即更新快捷键管理器的设置
_hotkeyManager.SetEnableHotkeysInMouseMode(isEnabled);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"处理鼠标模式快捷键开关切换时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
/// <summary>
/// 加载鼠标模式快捷键设置
/// </summary>
private void LoadMouseModeHotkeySetting()
{
try
{
var isEnabled = _hotkeyManager.GetEnableHotkeysInMouseMode();
EnableHotkeysInMouseModeToggle.IsOn = isEnabled;
LogHelper.WriteLogToFile($"从主设置配置文件加载鼠标模式快捷键设置: {isEnabled}");
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"加载鼠标模式快捷键设置时出错: {ex.Message}", LogHelper.LogType.Error);
// 默认关闭
EnableHotkeysInMouseModeToggle.IsOn = false;
}
}
#endregion
}