Skip to content

Hellmessage/HellRCMenu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hell RCMenu

macOS 工具集合,功能两条主线:

  1. Finder 右键菜单管理 — 在 Finder 右键菜单中添加自定义动作项,类似「超级右键」
  2. 菜单栏系统状态 — 在系统菜单栏顶部实时显示网络流量、CPU、内存、GPU、IP 等指标

主应用、Finder Sync Extension、菜单栏 status item 三者各自独立运行,互不依赖。

功能

Finder 右键菜单

  • 9 种动作类型:
    • 用应用打开 - 用指定应用打开选中文件
    • 运行命令 - 执行 shell 命令(支持 {FILE_PATH} {DIR_PATH} {FILE_NAME} 占位符)
    • 复制路径 - 复制 POSIX 或 URL 格式路径到剪贴板
    • 移动到 / 复制到 - 移动 / 复制文件到指定目录
    • 新建文件 - 在当前目录创建文件(支持模板内容)
    • 在终端打开 - Terminal / iTerm2 / Warp
    • 卸载应用 - 拖动 .app 时显示,深度扫描容器并清理
    • 解压文件 - 内置 7zz,支持 rar/zip/7z/tar.gz 等
  • 支持显示条件过滤(文件扩展名、目录/文件、选中数量)
  • 支持菜单分组(子菜单)
  • 自定义图标:SF Symbol、Emoji 或本地 PNG
  • 配置变更实时同步到 Extension(DistributedNotificationCenter)
  • Extension 独立运行,关闭主应用后右键功能依然有效

菜单栏状态

  • 实时显示指标(1Hz 刷新):
    • 网络流量 - 上传 / 下载双向速率(双行 ▲/▼)
    • 本机 IP - 内网 + 公网 IPv4(公网每 10 分钟刷新)
    • CPU / 内存 / GPU 占用率
  • 每个指标渲染为独立"双行 block":上 = 数值,下 = 标签
  • SF Mono 等宽字体,固定宽度,数字跳动不抖
  • 点击图标弹出菜单,菜单项 1Hz 实时刷新
  • 配置界面 WYSIWYG 拖拽编辑器:
    • 上方区域模拟实际菜单栏外观
    • 下方区域模拟弹出菜单
    • 跨区域拖动 chip 调整指标归属
    • 同区域内拖到目标项之前调整顺序
  • 开机自启(SMAppService),启动后只显示菜单栏,不弹主窗口

URL scheme

应用注册了 hellrcmenu:// URL scheme,Finder 菜单的卸载 / 解压动作通过它唤起后台任务:

  • hellrcmenu://uninstall?path=...&path=... 卸载多个 .app
  • hellrcmenu://extract?path=...&path=... 串行解压多个压缩包
  • hellrcmenu://show 二进程实例触发主窗口显示

URL-only 触发的进程会在任务结束后自动退出,不残留菜单栏图标。

技术栈

  • 纯 Swift / SwiftUI - 不依赖 Xcode 项目,直接 swiftc 编译
  • Finder Sync Extension - 基于 FIFinderSync 实现右键菜单
  • Makefile 构建系统
  • AppKit / NSStatusItem - 菜单栏状态项 + 自定义双行 block 视图
  • getifaddrs / host_statistics / IOAccelerator - 网络流量、CPU/内存、GPU 利用率采样
  • SMAppService - 开机自启注册(macOS 13+)
  • App Sandbox - 仅 Extension 沙盒(macOS 强制要求);主应用不沙盒以便 IOKit / sysctl 调用

项目结构

hell-rcmenu/
├── Makefile                      # 构建脚本
├── Sources/                      # 主应用源码(SwiftUI + AppKit)
│   ├── AppDelegate.swift         # 应用入口、URL 分发、激活策略
│   ├── MainView.swift            # 主窗口
│   ├── MenuListView.swift        # 右键菜单列表
│   ├── MenuItemFormView.swift    # 单个菜单项编辑表单
│   ├── ActionEditorView.swift    # 9 种动作类型编辑器
│   ├── ConditionEditorView.swift # 显示条件编辑
│   ├── SettingsView.swift        # 全局设置(扩展状态、开机自启、菜单栏布局)
│   ├── IconPickerView.swift      # SF Symbol / Emoji / PNG 图标选择
│   ├── AboutView.swift
│   ├── ExtractController.swift   # 解压(调用内置 7zz)
│   ├── UninstallController.swift # 卸载 .app + 容器清理
│   ├── LoginItemController.swift # SMAppService 开机自启封装
│   ├── StatusBarController.swift # 菜单栏 NSStatusItem + 弹出 NSMenu 总控
│   ├── StatusBarLayoutEditor.swift # 配置界面 WYSIWYG 拖拽编辑
│   ├── NetworkTrafficMonitor.swift # 网络速率 + 内网/公网 IP
│   └── SystemStatsMonitor.swift  # CPU / 内存 / GPU 利用率
├── Shared/                       # 主应用 + Extension 共享代码
│   ├── Constants.swift
│   ├── MenuModel.swift           # 右键菜单数据模型
│   ├── StatusBarLayout.swift     # 菜单栏指标布局数据模型
│   ├── ConfigManager.swift       # 配置管理(主应用,依赖 Combine)
│   ├── ConfigReader.swift        # 配置读取(Extension 用)
│   └── IconRenderer.swift        # 图标渲染
├── Extension/                    # Finder Sync Extension 源码
│   ├── FinderSync.swift          # FIFinderSync 子类
│   ├── Info.plist
│   └── Entitlements.plist        # 沙盒授权
├── Vendor/
│   └── 7zz                       # 内置 7-Zip 二进制(自动从 GitHub 拉取)
├── Resources/
│   ├── Info.plist                # 主应用 plist
│   ├── AppIcon.icns
│   └── logo.png
└── build/                        # 构建产物

系统要求

  • macOS 13.0+(Ventura 或更新版本,SMAppService、IOKit 等需要)
  • Apple Silicon(arm64)
  • Xcode Command Line Tools(xcode-select --install)

构建与安装

1. 创建代码签名证书(首次必须)

由于 macOS 强制要求 FinderSync 扩展必须由可信证书签名(ad-hoc 签名不被 pluginkit 接受),需要创建一个自签名的本地代码签名证书。

步骤

  1. 打开「钥匙串访问」(Keychain Access)

    open -a "Keychain Access"
  2. 菜单栏:钥匙串访问 > 证书助理 > 创建证书...

  3. 填写证书信息:

    • 名称: Hell Dev(必须与 Makefile 中的签名身份一致)
    • 身份类型: 自签名根证书
    • 证书类型: 代码签名
    • 勾选 「让我覆盖默认值」
  4. 后续步骤全部点「继续」使用默认值,最后点「完成」

  5. 信任证书:

    • 在钥匙串中找到 Hell Dev 证书(通常在「登录」钥匙串)
    • 双击打开证书
    • 展开 「信任」 部分
    • 「代码签名」 改为 「始终信任」
    • 关闭窗口(系统会要求输入密码确认)
  6. 验证证书已可用:

    security find-identity -v -p codesigning

    应该能看到:1 valid identities found,列出 "Hell Dev"

2. 编译

make build

构建产物:build/Hell RCMenu.app

3. 安装

make install

安装到 /Applications/Hell/Hell RCMenu.app,自动重启 Finder 加载新版扩展。

4. 启用 Finder 扩展

  1. 打开应用:

    open "/Applications/Hell/Hell RCMenu.app"
  2. 打开「系统设置」 > 「常规」 > 「登录项与扩展」 > 找到 「访达扩展」(或在「隐私与安全性 > 扩展 > 已添加的扩展」中找到 Hell RCMenu)

  3. 启用 HellRCMenu 扩展开关

  4. 在 Finder 中右键任意文件或文件夹,应该能看到自定义菜单项

提示:如果在系统设置中找不到扩展,可以用命令行启用:

pluginkit -e use -i com.hell.tools.rcmenu.finder-extension

Makefile 目标

目标 说明
make / make build 编译主应用 + Extension + 签名
make install 编译 + 签名 + 安装到 /Applications/Hell/
make dev 编译并启动应用
make clean 清除构建产物
make uninstall 卸载应用
make vendor-7zz 重新下载内置 7-Zip 二进制
make help 显示帮助

配置文件位置

  • 主应用配置:~/Library/Application Support/com.hell.tools.rcmenu/config.json
  • Extension 沙盒副本(由主应用自动同步): ~/Library/Containers/com.hell.tools.rcmenu.finder-extension/Data/Library/Application Support/com.hell.tools.rcmenu/config.json

主应用保存配置时会同时写入两个位置,并通过 DistributedNotificationCenter 通知 Extension 重载。

config.json 中:

  • items — 右键菜单项树
  • statusBarLayout — 菜单栏 / 弹出菜单的指标排列
  • enabled / showIcons — 全局开关

架构说明

SwiftUI 主应用                       Finder Sync Extension (.appex)
   │                                          ▲
   │ 1. 写 config.json                        │ 4. 读 config.json
   ▼                                          │
~/Library/Application Support/   ──→  ~/Library/Containers/.../Data/...
   │                                          ▲
   │ 2. 发送 DistributedNotification          │ 3. 收到通知后重载
   └──────────────────────────────────────────┘

       菜单栏 NSStatusItem                       URL handler
              │                                       │
   getifaddrs / host_statistics             hellrcmenu://uninstall
   IOAccelerator / SCNetwork                hellrcmenu://extract
              │                                       │
        每秒采样并渲染                        后台静默处理后退出
  • 主应用与 Extension 分别独立运行
  • Extension 由 Finder 加载,关闭主应用不影响右键功能
  • Extension 必须沙盒化(macOS 强制要求),所以配置文件需复制到 Extension 容器目录
  • 菜单栏状态项随主应用进程存在;关闭主窗口后切回 .accessory 但进程不退出,菜单栏图标常驻

已知问题

  • 无开发者账号限制:自签名证书只能在创建该证书的机器上使用,无法分发给其他用户
  • GPU 利用率读自 IOAccelerator 私有键(Device Utilization %),该字段未公开 API,后续 macOS 版本可能改变
  • 公网 IP 通过 ipify 获取:依赖外网访问,断网时显示占位

卸载

make uninstall

或手动删除:

rm -rf "/Applications/Hell/Hell RCMenu.app"
rm -rf ~/Library/Application\ Support/com.hell.tools.rcmenu
rm -rf ~/Library/Containers/com.hell.tools.rcmenu.finder-extension

如果启用了开机自启,先在主应用「设置 → 通用」里关闭后再卸载;否则需要在系统设置「通用 → 登录项与扩展」中手动移除残留登录项。

License

个人使用项目,无授权限制。

About

macOS 工具:Finder 右键菜单管理 + 菜单栏系统状态实时显示(网速 / CPU / 内存 / GPU / IP)

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors