Windows 全局热键工具:按一个快捷键切换任意应用的显示/隐藏。例如 Ctrl+Alt+1 呼出微信,再按一次最小化回去。
- 任意数量的「热键 → 应用」映射,全部写在 exe 同目录的
config.jsonc里 - 应用未运行时自动按配置路径启动
- 窗口最小化 → 还原并置前;显示中 → 最小化
- 配置文件保存即热重载,无需重启
- 配置支持注释和尾随逗号,默认模板内置字段说明与可复制示例
- 系统托盘运行,右键菜单可打开配置 / 暂停热键 / 开关开机自启 / 退出;双击托盘图标也可打开配置
- 同一 Windows 用户只运行一个实例,重复启动不会创建第二个托盘图标
cd src/HotkeyManager
dotnet run发布单文件 exe(无需安装 .NET 运行时):
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true产物在 bin/Release/net8.0-windows/win-x64/publish/HotkeyManager.exe,单个 exe 拷走即可;配置文件首次运行时自动生成。
制作安装包(需安装 Inno Setup 6,脚本会引用发布产物):
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer/setup.iss产物为 installer/HotkeyManagerSetup-<版本>.exe:向导可自定义安装路径、可选开机自启/桌面快捷方式;配置保存在安装目录的 config.jsonc,安装/卸载均不触碰。
也可以用 tools/build.ps1 一键完成「改版本号 → 发布 → 打包」:
./tools/build.ps1 # 沿用当前版本号直接打包
./tools/build.ps1 -Version 1.1.0 # 同步版本、归档 Changelog 后再打包构建完整发布包:
./tools/package-release.ps1产物位于 dist/:
HotkeyManager-<版本>-Windows-x64-Setup.exe:安装包HotkeyManager-<版本>-Windows-x64-portable.zip:便携版- 每个产物对应的
.sha256校验文件
GitHub Actions 会在以下情况运行:
- Pull Request 和
main分支提交:构建安装包与便携版,并保留 14 天的构建产物。 - 推送
vX.Y.Z标签:创建 GitHub Release,上传安装包、便携版和 SHA-256 文件,并使用对应 Changelog 作为发布说明。 - 推送
vX.Y.Z-suffix标签:例如v1.1.0-beta.1,发布为 pre-release。
发布前先在 [Unreleased] 记录变更,再更新版本并归档 Changelog:
# 先把本次变更写入 CHANGELOG.md 的 [Unreleased]
./tools/bump-version.ps1 minor # 也支持 major / patch / 直接指定 X.Y.Z
git add src/HotkeyManager/HotkeyManager.csproj installer/setup.iss CHANGELOG.md
git commit -m "chore: bump version to 1.1.0"
git tag v1.1.0
git push origin main v1.1.0bump-version.ps1 会同步项目与安装器版本,并将 [Unreleased] 归档为带日期的新版本。可使用 -Date YYYY-MM-DD 指定日期、-SkipChangelog 仅更新版本文件,或用 -DryRun 预览。工作流会校验 tag 与项目版本一致,避免误发版本。
配置文件位于 exe 所在目录(安装目录)的 config.jsonc,首次运行时自动写入带注释的引导模板(内容与仓库根目录 config.jsonc 一致),保存即热重载。右键托盘图标选择「打开配置文件」,或直接双击托盘图标即可编辑。
| 字段 | 说明 |
|---|---|
key |
组合键字符串,最后一段为按键,其余为修饰键(Ctrl / Alt / Shift / Win),如 alt+1、ctrl+alt+a。普通按键建议搭配至少一个修饰键,F1F24 可单独使用;按键还支持 AZ、NumPad0 等 WinForms Keys 名称 |
processName |
进程名,不含 .exe |
exePath |
进程未运行时用于启动的路径 |
windowClass |
可选。窗口类名(用 Spy++ / Window Detective 查看),填写后优先按类名查找,能定位到最小化到托盘的隐藏窗口 |
注意:
- 热键被其他程序先注册时会失败,托盘会弹提示,换一个组合即可
- 微信老版本类名是
WeChatMainWndForPC,新版(4.0+)会变,建议用 Spy++ 实测后填入 - 要控制以管理员身份运行的应用,本程序也需以管理员身份运行
src/HotkeyManager/
├── Program.cs # 入口,启动托盘 + 消息循环
├── HotkeyAppContext.cs # 组装各服务,应用配置
├── Core/
│ ├── HotkeyService.cs # RegisterHotKey 封装,WM_HOTKEY 分发
│ ├── HotkeyParser.cs # "ctrl+alt+1" → 修饰键标志 + 虚拟键码
│ ├── SingleInstanceGuard.cs # 按 Windows 用户隔离的单实例保护
│ └── WindowService.cs # 窗口查找、显示/隐藏切换、置前
├── Config/
│ ├── AppConfig.cs # 配置模型
│ └── ConfigManager.cs # config.jsonc 加载与热重载
├── Tray/
│ └── TrayIcon.cs # 托盘图标与右键菜单
└── Interop/
└── User32.cs # P/Invoke 声明
{ // 可以添加任意数量的配置对象;末尾逗号也是允许的。 "hotkeys": [ { "key": "ctrl+alt+1", "processName": "notepad", "exePath": "C:\\Windows\\System32\\notepad.exe", "windowClass": "", }, ] }