# MGest **Repository Path**: nanull/mgest ## Basic Information - **Project Name**: MGest - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-28 - **Last Updated**: 2026-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MGest Windows 全局鼠标手势工具,在任意窗口按住鼠标右键画出手势,即可触发快捷键或输入文本。 基于 [WGestures](https://github.com/yingDev/WGestures) 精简重构。保留手势引擎核心,砍掉安装程序、触摸支持、热角、边缘滑动、v1 迁移等高级功能,同时修复了原版多处 Bug,提升了代码质量和架构清晰度。 ## 功能 - **全局手势**:在任意窗口按住鼠标右键画出手势,触发预设操作 - **8 方向手势**:支持上、下、左、右及四个对角方向 - **执行快捷键**:手势可映射为任意键盘快捷键组合 - **按键序列**:手势触发后自动输入指定文本,支持 `{sleep 毫秒}` 插入延迟 - **手势轨迹可视化**:绘制手势时实时显示轨迹和命令名称 - **系统托盘**:最小化到托盘运行,支持开机自启 - **单实例**:重复启动时自动打开已有实例的设置窗口 - **导入/导出**:支持手势配置的 JSON 格式导入导出 ## 相比 WGestures 的改进 ### Bug 修复 | 问题 | WGestures | MGest | | ---------------------- | -------------------------------------------------------------- | ------------------------------ | | `GetAngle` 零向量除以零 | `va_val` 或 `vb_val` 为 0 时产生 NaN | 新增零向量防护 | | 8方向手势 Y 坐标错误 | `StartPoint.X` 写成了 `.X` | 修正为 `.Y` | | `IsInCaptureMode` 线程安全 | getter 无锁,setter 有锁 | getter 也加了 `lock` | | `Dispose` 终结器路径 | 终结器也调用 `Uninstall()`,可能访问已回收对象 | 终结器路径不调用 | | `Clone` 浅拷贝 | 共享同一个对象引用,修改副本会影响原件 | 通过 JSON 序列化做深拷贝 | | 方法名拼写错误 | `_uinstall` | 修正为 `_uninstall` | | Plist 线程安全 | 静态方法无锁,多线程下会竞争静态字段 | 所有公共方法加了 `lock` | | DiBitmap 内存泄漏 | `SystemDisplaySettingsChanged` 中直接覆盖旧对象 | 先 `Dispose()` 旧对象再创建新的 | | 配置字段赋值错误 | `InitialStayTimeoutMillis` 的 setter 使用了 `StayTimeoutMillis` 字段 | 修正为正确的字段 | | delegate 命名 | `LowLevelkeyboardHookProc`(k 小写) | 修正为 `LowLevelKeyboardHookProc` | | 异常被吞掉 | `GestureIntent.Execute` 中 catch 块静默忽略异常 | 真实捕获并返回异常信息 | ### 架构改进 - **AppBootstrapper**:将 700 行 `Program.cs` 重构为 33 行入口 + 独立引导器,职责分离更清晰 - **Gesture.Dirs 封装**:从 `public List` 改为 `internal` 字段 + `IReadOnlyList` 公开接口 - **日志系统**:新增 `Logger` 类,替代原版的 `Console.WriteLine` - **资源管理**:`_componentsToDispose` 集中管理组件生命周期,`Dispose()` 统一释放 - **手势存储**:从自定义 `.wg2` 格式改为通用 `.json` 格式 ### 精简的功能 | 删除的功能 | 说明 | | --------------- | ------------------- | | 按进程区分手势 | 不再支持不同程序使用不同手势 | | 热角 (HotCorner) | 屏幕四角触发命令 | | 边缘滑动 (EdgeRub) | 屏幕边缘滑动触发命令 | | 滚轮手势 (Modifier) | 配合滚轮的手势修饰 | | 多鼠标按钮 | 仅支持右键,不支持中键/X1/X2 | | 触摸手势 | TouchHook、触摸注入 | | 12 种命令中的 10 种 | 仅保留执行快捷键和按键序列 | | 自动更新检查 | VersionChecker | | 快速入门向导 | QuickStartGuide | | 360 安全警告处理 | Warn360 | | 版本迁移 | v1 → v2 数据迁移 | | 全局热键管理 | GlobalHotKeyManager | ## 环境要求 - Windows 7 / 8 / 10 / 11 - .NET Framework 3.5 或更高版本 - Visual Studio 2013+(如需编译) ## 默认手势 | 手势 | 命令 | 快捷键 | | --- | ----- | ------------ | | ↓← | 关闭标签页 | Ctrl+W | | ↑ | 复制 | Ctrl+C | | ↓ | 粘贴 | Ctrl+V | | ← | 撤销 | Ctrl+Z | | → | 恢复标签页 | Ctrl+Shift+T | 可在设置界面中自定义手势和命令。 ## 使用方式 1. 运行 `MGest.exe`,程序最小化到系统托盘 2. 在任意窗口按住 **鼠标右键** 并画出轨迹 3. 松开鼠标后自动执行绑定的命令 4. 双击托盘图标或右键托盘图标 → 设置,打开手势管理界面 ## 项目结构 ``` MGest/ ├── MGest.App/ 主程序(界面、启动、配置) │ ├── AppBootstrapper.cs 应用引导器(IoC、生命周期管理) │ ├── Gui/Windows/ 设置窗口、编辑手势窗口 │ └── defaults/ 默认手势配置 ├── MGest.Common/ 公共工具 │ ├── Logger.cs 日志系统 │ ├── Config/ Plist 配置读写 │ └── OsSpecific/Windows/ Win32 API 封装、屏幕信息、DPI 感知 ├── MGest.Core/ 手势引擎核心 │ ├── App.cs 核心数据模型 │ ├── GestureParser.cs 手势方向解析 │ ├── Commands/ 命令体系(执行快捷键、按键序列) │ ├── Persistence/ 手势存储(JSON)和意图查找 │ └── Impl/Windows/ 鼠标钩子、路径追踪 ├── MGest.View/ 手势轨迹可视化(画布渲染) └── WindowsInput/ 键盘鼠标输入模拟(第三方库) ``` ## 许可证 本项目基于 [GNU General Public License v2.0](LICENSE) 发布。 本项目衍生自 [yingDev/WGestures](https://github.com/yingDev/WGestures)(GPL-2.0),在此感谢原作者 Ying Yuandong。