# MiddleQ **Repository Path**: ProgHub/MiddleQ ## Basic Information - **Project Name**: MiddleQ - **Description**: 在Mac上使用鼠标中键点击Dock栏的应用图标以快速退出该应用 - **Primary Language**: Swift - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-27 - **Last Updated**: 2026-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

MiddleQ - MacOS Dock栏中键退出工具

MiddleQ Logo

使用鼠标中键点击Dock栏中已启动的APP图标,可快速退出该应用。
当前版本:v1.4.0 | 系统要求:macOS 13.0+

--- ## 🌟 特性亮点 - **⚡ 快捷高效**: 在 Dock 上中键点击即可秒退应用,无需右键菜单或 Cmd+Q - **🧠 智能识别**: 自动识别点击的 Dock 图标并终止对应应用进程 - **🔄 自动扫描**: 首次启动自动扫描所有已安装应用,智能建立映射关系 - **⚙️ 灵活配置**: 支持手动添加自定义应用映射,满足特殊需求 - **🛡️ 安全防护**: 智能保护 Finder(访达)不被意外退出 - **🚀 开机自启**: 支持开机自动启动,后台静默运行(macOS 13.0+) - **💻 双架构支持**: Universal Binary 同时支持 Intel 和 Apple Silicon - **🍃 轻量级**: 菜单栏常驻,资源占用极低,几乎无感知 --- ## 📖 核心原理 MiddleQ 之所以能实现“指哪打哪”的精准退出,主要依赖于 macOS 底层的 **辅助功能 (Accessibility)** 与 **事件监听 (Event Tap)** 机制: * **全局“捕获”:** 软件启动后会创建一个全局的事件监听器,专门“盯着”鼠标的中键动作(在 macOS 内部被称为 Button 2)。 * **空间坐标定位:** 当你按下中键时,MiddleQ 会瞬间获取当前鼠标在屏幕上的物理坐标。 * **元素识别:** 利用 macOS 的辅助功能 API,软件会向系统询问:“在这一对坐标点上,到底住着哪个 UI 元素?”。如果系统反馈这是一个 **Dock 项目 (AXDockItem)**,MiddleQ 就会进一步提取该图标显示的名称(比如“Visual Studio Code”)。 * **精准打击:** 拿到名称后,软件会在后台运行的应用列表中寻找对应的进程。一旦匹配成功,立即发送退出指令,实现快速关闭。 * **安全屏障:** 为了防止误伤,软件内置了保护机制。即便你在“访达 (Finder)”上点击中键,它也会无视,确保访达不会被意外退出。 --- ## ⚙️ 配置文件 ### 连接名称与身份的桥梁 有些应用在 Dock 上显示的名称(如“Visual Studio Code”)与其真实的身份标识(Bundle ID)并不一致,此时使用默认的“名称匹配进程“的方式便会失效。为了解决这个“对不上号”的问题,MiddleQ 引入了一套映射系统,其核心就是位于用户资源库中的 **JSON 配置文件**。 ### 它的作用 配置文件主要充当 **“翻译官”**。当自动扫描无法准确关联应用图标与运行进程时,你可以通过修改配置文件,手动告诉 MiddleQ:“看到 A 这个名字,请退出 B 这个程序”。 ### 工作原理 1. **自动初始化:** 软件在启动时会自动扫描你系统中的 `/Applications` 目录和 `~/Applications` 目录 ,将大多数应用的名称与它们的唯一身份标识(Bundle ID)建立初步映射。 2. **配置优先:** 然后软件会继续加载位于 `~/Library/Application Support/MiddleQ/config.json` 的文件。如果你在文件中手动定义了映射关系,它的优先级将高于软件自动扫描的结果,因为扫描的结果可能不准确,比如他会把 `腾讯会议` 的名字识别为 `TencentMeeting`(后续会优化这点)。 3. **动态覆盖:** 当你编辑完配置文件,点击“重新加载映射”时,MiddleQ 会清空内存中的旧映射表,先进行应用扫描,再进行配置扫描,加载所有映射关系,确保拦截动作的准确性。 --- ## 📦 安装 ### 方法一:下载预编译版本(推荐) 1. 从 [Releases](https://github.com/yourusername/MiddleQ/releases) 页面下载最新的 `.dmg` 文件 2. 双击打开 DMG 文件 3. 将 `MiddleQ.app` 拖拽到 `Applications` 文件夹 4. 首次运行时系统会提示安全性警告,前往 **系统偏好设置 > 隐私与安全性** 允许运行 ### 方法二:源码编译 ```bash # 克隆仓库 git clone https://github.com/yourusername/MiddleQ.git cd MiddleQ # 授权脚本可执行权限 chmod +x build.sh chmod +x package_dmg.sh # 编译应用(如果需要自定义版本号,可以先修改version.txt中的版本号,执行脚本会自动同步到应用配置) ./build.sh # 打包为 DMG(可选) ./package_dmg.sh ``` 编译产物: - `MiddleQ.app` - 可直接运行的应用 - `MiddleQ_v1.3.0.dmg` - 安装包(用于分发) --- ## 🚀 使用方法 ### 基本操作 1. **启动 MiddleQ** - 在 Applications 文件夹中找到并运行 `MiddleQ.app` - 运行后会在菜单栏显示鼠标图标 🖱️ 2. **授予辅助功能权限** - 系统会弹出权限请求对话框 - 前往 **系统偏好设置 > 隐私与安全性 > 辅助功能** - 点击左下角锁图标解锁 - 添加并勾选 `MiddleQ.app` 3. **使用中键退出应用** - 在 Dock 中使用鼠标中键(滚轮按键)点击任意运行中的应用图标 - 该应用会立即退出 ### 菜单栏功能 点击菜单栏的 🖱️ 图标可以访问以下功能: | 功能 | 快捷键 | 说明 | |----------------|--------|---------------| | **开机自动启动** | - | 开启/关闭开机自启动 | | **编辑配置文件** | `⌘E` | 打开配置文件进行编辑 | | **重新扫描映射** | `⌘R` | 编辑完成后重新加载映射关系 | | **退出 MiddleQ** | `⌘Q` | 完全退出应用 | --- ## ⚙️ 配置 ### 配置文件位置 ``` ~/Library/Application Support/MiddleQ/config.json ``` ### 手动配置说明 对于某些不生效的应用,可以手动添加映射: #### 步骤一:使用终端命令获取应用 Bundle ID ```bash # 使用 mdls 命令(推荐) mdls -name kMDItemCFBundleIdentifier /Applications/应用名称.app ``` #### 步骤二:编辑配置文件 1. 点击菜单栏图标 > **"编辑配置文件"**(或按 `⌘E`) 2. 在打开的 JSON 文件中添加映射,其中key是应用在Dock栏中显示的名称,value是应用的Bundle ID 3. 保存文件(`⌘S`) 4. 点击菜单栏图标 > **"重新加载映射"**(或按 `⌘R`) ### 配置示例 ``` { "Chrome": "com.google.Chrome", "微信": "com.tencent.xinWeChat", "QQ": "com.tencent.qq", "钉钉": "com.alibaba.DingTalkMac", "Visual Studio Code": "com.microsoft.VSCode" } ``` > 💡 **提示**: 大多数应用已被自动扫描添加,仅在特殊情况下需要手动配置。 --- ## 🔧 开发 ### 技术栈 - **语言**: Swift 5+ - **平台**: macOS 13.0+ - **架构支持**: Intel (x86_64) + Apple Silicon (arm64) 通用二进制 - **依赖框架**: - Cocoa (AppKit) - 应用界面 - ApplicationServices - 辅助功能 API - ServiceManagement - SMAppService 开机自启 - UserNotifications - 用户通知 ## 🔒 安全性和权限 ### 所需权限 | 权限类型 | 用途 | 授权方式 | |---------|------|---------| | **辅助功能权限** | 监听全局鼠标事件、访问 Dock 元素信息 | 系统弹窗引导至隐私设置 | | **文件系统访问** | 读写配置文件 (`~/Library/Application Support/MiddleQ/`) | 应用沙盒自动授权 | ### 隐私承诺 - ✅ **零数据收集**: 不收集、上传任何用户数据 - ✅ **零网络连接**: 纯本地应用,无任何网络请求 - ✅ **开源透明**: 代码完全开源,可随时审计 - ✅ **最小权限**: 仅请求必要权限,无过度索权 --- ## 🐛 故障排除 ### 常见问题 #### Q: 应用无法正常工作 **A**: 请按以下步骤检查: 1. **检查辅助功能权限** ``` 系统偏好设置 > 隐私与安全性 > 辅助功能 ``` 确保 `MiddleQ.app` 已勾选 2. **重启应用** - 退出 MiddleQ(菜单栏 > 退出 MiddleQ) - 重新启动 MiddleQ.app 3. **查看日志** ```bash log stream --predicate 'process == "MiddleQ"' --info ``` #### Q: 某些应用无法通过中键退出 **A**: 1. **刷新应用映射** - 点击菜单栏 > "扫描所有应用" - 等待扫描完成 2. **仍然无效则手动添加映射** ```bash # 获取 Bundle ID mdls -name kMDItemCFBundleIdentifier /Applications/问题应用.app # 编辑配置文件添加映射 # 菜单栏 > 编辑配置文件 ``` 3. **检查应用名称** - 确认 Dock 中显示的名称与配置 key 一致 - 注意大小写和空格 #### Q: 开机自启功能不可用 **A**: - **系统版本要求**: macOS 13.0 或更高版本 - **检查方法**:  > 关于本机 > 查看 macOS 版本 - **替代方案**: 旧版本系统可手动添加到登录项 #### Q: 配置文件格式错误 **A**: 1. **恢复默认配置** ```bash # 删除配置文件 rm ~/Library/Application\ Support/MiddleQ/config.json # 重启应用会自动创建新文件 ``` 2. **JSON 语法检查** - 确保使用双引号 `"` - 键值对用冒号 `:` 分隔 - 最后一项后不加逗号 --- ## 📄 许可证 本项目采用 **MIT 许可证** - 查看 [LICENSE](LICENSE) 文件了解详情 **简要说明**: - ✅ 可自由使用、修改、分发 - ✅ 可用于商业用途 - ❗ 需保留原始版权声明 - ❗ 不提供任何担保 --- ## 🙏 致谢 - 感谢所有贡献者和用户的支持 - 特别感谢开源社区提供的各种工具和库 - 基于 macOS Accessibility API 实现 --- ## 📞 联系方式 如有问题或建议,请通过以下方式联系: - **Issues**: [提交问题](https://gitee.com/ProgHub/MiddleQ/issues) - **邮箱**: wang.chaofan@foxmail.com ---

Made with ❤️ for macOS users
版本:1.4.0 | 最后更新:2026-03-05