三角洲口琴自动演奏
三角洲更新了口琴,无奈五音不全+手残,实在学不会。所以做了这个项目来辅助。

免责声明
这个工具靠Windows 键鼠模拟(SendInput)实现按键,不读游戏内存、不注入进程、不含驱动、不做任何反作弊规避,也不修改游戏文件。
但模拟输入本身仍然可能违反用户协议,并导致账号处罚。使用此项目默认知晓,所有后果由使用者承担。
本身是只个人自用工具,与游戏官方无关。它只是在游戏里把一首曲子完整弹出来,不是拿来获取任何竞技优势的。
下载
项目
下载地址:https://pan.quark.cn/s/eee9d5b7a8a3
MIDI文件
MIDI文件需要自行准备,收集了部分文件,可使用下面地址或者在交流群内获取
下载地址:https://pan.quark.cn/s/a19432dbdb44
游戏交流群:1085994601
更新记录
2.1.0 — 2026-10-03:新增功能
快捷键改为按键捕获录入;
2.0.0 — 2026-10-03:用 Rust + Slint 完全重写
2.0 是一次从零开始的重写:所有 C# / WPF 代码都已移除,换成 Rust 核心库 + Slint 界面。用法和界面布局(演奏 / 设置 / 关于三页)基本不变。
为什么重写
旧版 1.x 在演奏中会崩溃,加日志后查明原因是 UCEERR_RENDERTHREADFAILURE (0x88980406):WPF 默认用显卡(Direct3D)绘制界面,三角洲行动全屏运行时会重置显卡设备,WPF 的渲染线程随之失效,窗口一挪动或重绘就抛异常。当时的临时修复是强制 WPF 用软件渲染。
借这次机会重新评估了整体方案:这个程序最在乎的是节奏准、任何情况下都能松开按键、不受游戏影响、单文件好分发,界面本身很简单。Rust 没有垃圾回收停顿,能用析构函数保证松键,编译出来是不依赖运行时的小 exe;Slint 自带纯 CPU 渲染器,从根上避开显卡设备丢失问题。
1.x — 2026-09(C# / WPF,已停止维护)
最初版本。.NET 10 + WPF 桌面程序,提供 MIDI 导入、单音化、口琴键位映射、预览表、全局快捷键、自动检测游戏窗口和三秒倒计时演奏。后期补丁:
增加崩溃日志(crash.log),记录未处理异常和演奏状态变化。 定位到全屏游戏导致的 WPF 渲染线程崩溃,改为强制软件渲染。 清单改为要求管理员权限。 日志重复错误折叠、界面刷新合并、演奏期间提高系统计时精度。
使用方式
启动游戏→打开口琴→打开项目→导入 MIDI 文件 → 启用游戏内输出 → 点播放或者按 F8(3 秒延迟)→返回游戏
三角洲口琴 MIDI 演奏器
Windows 桌面程序(Rust + Slint)。选择 MIDI 旋律轨,配置游戏按键后,用全局快捷键控制单音自动演奏。默认只走无输入预览,不会向游戏发键。
发布产物是一个约 12 MB 的单文件 harmonica.exe,不需要安装任何运行时。程序清单要求管理员权限(游戏以管理员运行,低权限进程发出的模拟输入会被 Windows 丢弃),双击时会弹出 UAC 确认。
构建
需要 Rust(stable,MSVC 工具链即可)。仓库根目录执行:
powershell
cargo build --release
# 产物:target\release\harmonica.exe调试版(cargo build)保留控制台窗口,方便看 panic 输出;发布版没有控制台。因为清单要求管理员权限,cargo run 需要在"以管理员身份运行"的终端里执行。
测试只覆盖与平台无关的核心逻辑,任何系统上都能跑:
powershell
cargo test --lib在 Linux 上交叉编译 Windows 版
bash
rustup target add x86_64-pc-windows-gnu
pip install ziglang && cargo install cargo-zigbuild
cargo zigbuild --release --target x86_64-pc-windows-gnu图标与清单
res/app.rc 引用 res/app.ico 和 res/app.manifest(管理员权限、Per-Monitor V2 DPI、通用控件 v6),预先编译成 res/app.res 随仓库提交,build.rs 直接把它交给链接器——这样构建机上不需要 rc.exe 或 windres。改了这三个文件之一后重新生成:
powershell
rc.exe /fo res\app.res res\app.rc # Visual Studio 开发者命令行
# 或
zig rc /fo res\app.res res\app.rc图标本身由 tools/make-icon.ps1 生成(GDI+ 画蓝底口琴格条,打包成多尺寸 ICO),改配色或形状改脚本里的常量后重新跑一次,再按上面重新生成 app.res。
代码结构
src/
lib.rs 核心库入口(纯逻辑,可在任何平台测试)
midi.rs 宽容的 MIDI 解析:速度图、先进先出配对、越界数据/截断容错
convert.rs 多音 → 单音(保留最高音)、超音域按音名折八度
mapping.rs 口琴键位模型:8 个音符键 + 降八度/升半音/升八度鼠标键
plan.rs 按速度和松键间隔生成带绝对时间的按键计划
engine.rs 演奏引擎:独立线程、命令通道、松键守卫、前台检测
hotkey.rs 快捷键文本解析
settings.rs 设置(TOML)读写与校验
main.rs 程序入口、数据目录、panic 钩子
app.rs 界面控制器:把界面、引擎、快捷键、设置连起来
applog.rs 诊断日志(大小上限 + 重复折叠)
platform/ Windows 专用:SendInput、高精度计时器、找游戏窗口、全局快捷键
ui/app.slint 界面(Fluent 亮色风格,CPU 软件渲染)
res/ 图标、清单、预编译的 app.res几个关键设计:
计时:演奏引擎跑在独立的高优先级线程上,用
CreateWaitableTimerExW(高精度标志)睡到目标时间前约 1 ms 再自旋对准,不改系统全局计时精度。每个等待切片(≤ 4 ms)都会检查暂停/停止命令和游戏窗口是否仍在前台。松键:所有按住的键鼠登记在一张进程级表里。引擎用守卫对象管理按键,正常结束、出错、panic 展开时都会松开;panic 钩子和程序退出时再兜底一次。
界面不拖累演奏:界面只给引擎发命令、读状态快照;全局快捷键在自己的线程里处理,界面卡住时"停止"快捷键依然有效。
软件渲染:界面用 CPU 绘制,全屏游戏重置显卡设备时不会把本程序带崩(旧版 WPF 的崩溃原因就是这个)。
便携:设置
settings.toml和日志harmonica.log放在 exe 同目录;目录不可写(如放在 Program Files)时退回%LOCALAPPDATA%\HarmonicaAutoplay。
使用
界面分"演奏""设置""关于"三页。
导入
.mid/.midi,选择最像旋律的轨道。同一时段的多个音会转换成单音(保留最高音);超出游戏音域的音按相同音名折到最近的八度。点击"播放 / 继续"时生成预览表,列出每个口琴音的时间、MIDI 音高、时长和要按的键;转换说明和冲突问题显示在预览上方。在"设置"页填写 8 个音符键(
1 2 3 4 5 6 7 高音1,默认Z X C V B N M ,)、三个鼠标修饰键(默认降八度=左键、升半音=中键、升八度=右键)、速度倍率、松键间隔和快捷键(默认 F8 播放/暂停、F9 停止;支持Ctrl+Alt+Shift+Win+组合)。点"保存设置"后生效;快捷键被占用时设置不会保存,原快捷键保持可用。程序会自动检测三角洲行动窗口(按进程名
DeltaForceClient-Win64-Shipping等,也接受标题含"三角洲行动 / Delta Force"的窗口),无需手动捕获。勾选"游戏输出"并确认风险提示后,点击播放有 3 秒倒计时供你切回游戏。
游戏窗口离开前台时,程序会立即松开按键并暂停;切回后不会自动继续,按播放快捷键继续即可(被打断的那个音会重新奏一次)。停止、暂停、关闭程序都会松开程序按住的键。
排查问题
日志 harmonica.log 记录启动/正常退出、每次演奏状态变化和所有错误(含 panic 堆栈)。超过 512 KB 自动轮换为 harmonica.log.old,连续重复的同一错误只记一次并计数。如果日志最后停在"状态 → Playing"之类,既没有错误也没有"正常退出",说明进程是被外部结束的(例如反作弊或任务管理器)。
限制与风险
使用普通 Windows
SendInput(同时携带虚拟键码和扫描码);某些游戏可能不接受模拟输入。软件不使用驱动、注入或反作弊规避技术。自动模拟键鼠可能违反游戏规则并导致账号处罚。请自行确认所用客户端的规则;本软件不保证账号安全。
不支持音频转 MIDI,也不识别游戏内乐器状态。和弦会被转换为最高音,复杂伴奏会损失信息。没有经过实机确认的预置键位映射。
先在无输入预览中检查曲谱,再决定是否启用游戏输出。