菜单

快捷键

相关源文件

本文档介绍了 Shadowsocks Windows 客户端中的全局快捷键系统。快捷键系统允许用户使用全局键盘快捷方式控制 Shadowsocks 的各种功能,即使应用程序最小化到系统托盘也能正常工作。

概述

Shadowsocks 快捷键系统为常用操作提供了键盘快捷方式,例如开启/关闭代理、在全球模式和 PAC 模式之间切换以及在不同服务器之间导航。这些快捷键在整个操作系统中全局有效,无论当前焦点在哪一个应用程序上。

图示:快捷键系统架构和流程

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs10-173 shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs6-114

关键组件

HotKeys 类

HotKeys 静态类是快捷键系统的核心。它负责全局快捷键的注册、处理和转换。

主要组成部分包括:

  • HotKeyManager:一个与 Windows 交互的 GlobalHotKey 库管理器实例
  • 快捷键到回调映射:一个将每个快捷键与其相应操作关联起来的字典
  • 回调委托:定义快捷键回调函数签名的 HotKeyCallBackHandler 委托类型

图示:HotKeys 和 HotkeyCallbacks 类结构

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs10-173 shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs6-114

快捷键注册流程

当注册一个快捷键时,会发生以下过程:

  1. 应用程序将字符串表示(如 "Ctrl+A")转换为 HotKey 对象
  2. 调用 RegHotkey 方法,传入快捷键和回调
  3. 任何具有相同回调的现有快捷键都将被注销
  4. 通过 HotKeyManager 向 Windows 注册快捷键
  5. 快捷键和回调存储在 _keymap 字典中

如果快捷键已被其他应用程序注册,注册将失败并返回 false

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs40-163

快捷键回调系统

HotkeyCallbacks 类实现了按下快捷键时执行的实际操作。它是一个以 ShadowsocksController 引用初始化的单例类。

可用回调包括:

回调名称描述
SwitchSystemProxyCallback开启或关闭 Shadowsocks 代理
SwitchSystemProxyModeCallback在全球模式和 PAC 模式之间切换
SwitchAllowLanCallback切换是否允许局域网设备访问代理
ShowLogsCallback打开日志窗口
ServerMoveUpCallback选择列表中的上一个服务器
ServerMoveDownCallback选择列表中的下一个服务器

来源:shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs47-110

快捷键处理流程

以下序列图展示了快捷键按下后的处理过程:

图示:快捷键处理序列

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs32-38 shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs47-110

快捷键转换

HotKeys 类提供了在字符串表示和 HotKey 对象之间进行转换的方法:

  • HotKey2Str:将 HotKey 对象转换为 "Alt+Shift+D" 这样的字符串
  • Str2HotKey:解析 "Alt+Shift+D" 这样的字符串以创建 HotKey 对象

这些转换用于保存/加载快捷键配置并在用户界面中显示它们。

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs84-135

与 ShadowsocksController 集成

快捷键系统在 Shadowsocks 应用程序启动时进行初始化:

  1. ShadowsocksController 在其初始化过程中调用 HotKeys.Init(this)
  2. HotKeys.Init 初始化 HotKeyManager 并设置事件处理程序
  3. HotKeys.Init 调用 HotkeyCallbacks.InitInstance(controller) 以创建回调单例
  4. 应用程序关闭时,调用 HotKeys.Destroy() 清理资源

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs18-30 shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs9-17

常用快捷键操作

下表显示了可以分配给快捷键的常用操作:

操作回调方法操作
切换系统代理SwitchSystemProxyCallback启用或禁用代理
切换系统代理模式SwitchSystemProxyModeCallback在全球模式和 PAC 模式之间切换
切换允许局域网连接SwitchAllowLanCallback启用或禁用局域网访问代理
显示日志ShowLogsCallback打开日志窗口
选择上一个服务器ServerMoveUpCallback切换到列表中的上一个服务器
选择下一个服务器ServerMoveDownCallback切换到列表中的下一个服务器

来源:shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs47-110

技术实现细节

用于动态回调创建的反射

HotkeyCallbacks 中的 GetCallback 方法使用反射根据方法名动态创建委托。这允许在配置中通过名称引用快捷键回调。

来源:shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs24-30

快捷键注册中的错误处理

HotKeys 中的 Register 方法处理常见的注册错误:

  1. 如果快捷键已被应用程序注册,则默默地成功。
  2. 如果快捷键已被其他应用程序注册,则返回 false 表示失败。
  3. 如果参数无效,则抛出相应的异常。

来源:shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs139-163

总结

Shadowsocks Windows 客户端的快捷键系统提供了一种灵活且强大的方式,通过全局键盘快捷键控制应用程序。它使用 GlobalHotKey 库与 Windows 操作系统进行交互,并在快捷键注册/管理和实际回调实现之间提供了清晰的分离。