给 Windows 上任意一个软件生成"第二份"图标,双击就开出第二个实例,两个实例各有各的登录态与数据,互不干扰。
不注入、不挂钩、不装内核驱动、不捆绑任何东西。
Windows 上的软件通常只允许开一个实例:它启动时会申请一把"单实例锁"(绝大多数是命名互斥体 Mutex),发现锁已被占用,就把已经开着的窗口激活到前台,然后把自己关掉。你双击第二次看不到新窗口,不是卡了,是第二个进程被自己掐死了。
想同时登两个号,就必须让第二个实例拿到一把独立的锁。现有的做法只有三类:
- 关掉第一个实例持有的锁句柄 —— 遍历系统句柄表,把那个 Mutex 关掉,再启动第二个实例。市面上的"双开大师"和多数游戏多开器都是这个。
- 给第二个实例换一套数据目录 —— 浏览器系的
--user-data-dir就是这么回事。 - 让第二个实例跑在另一个 Windows 账户下 —— 用系统的多用户会话做隔离。
第 1 类要么注入进程、要么改内存,容易被反作弊系统和杀软盯上;第 2 类只对支持的软件有效;第 3 类最干净,但要输密码,而且对安装位置有要求。
twinlaunch 不发明第四条路。它做的是:自动判断某个软件适合走哪条现成的路,然后把它包装成一次双击。
用 Windows 的本地账户开第二个会话。对软件来说这就是另一台"电脑"——它的单实例锁是会话级的(内核对象名带 Local\ 前缀),两个会话里各有一把,天然不冲突。
优点:几乎对所有软件有效;隔离是真的,不是障眼法;软件自身检测不到任何异常。
约束:
- 程序必须装在全机可读的位置(
C:\Program Files\...这类)。装在C:\Users\<你>\AppData\Local\Programs\...的 per-user 安装,第二个账户根本看不到文件。 - 一个账户只能开一个实例。想开 3 个就要 3 个账户。
- 首次要解决"免密",否则每次都要输密码。
不换账户,只告诉程序"把数据写到这个目录":
QQ.exe --user-data-dir="D:\twinlaunch\qq-2"
程序把原本写进 %APPDATA% 的东西改写到指定目录。第二个实例拿到不同目录,于是配置、登录态、缓存全部独立。
优点:不需要第二个账户、不需要密码、可以开任意多个;对安装位置零要求(便携版、装在自己私有目录里都行)。
约束:
- 必须软件自己支持这个参数。Electron / Chromium 系(Chrome、Edge、VS Code、Discord、Slack、QQNT、多数国产新客户端)几乎都支持;原生 C++ 程序基本不支持。
- 通常只隔离数据目录,不隔离注册表。Chromium 系的单实例锁恰好就在数据目录里,所以够用;但如果某个程序把配置和锁写在
HKCU\Software\...,那这条路不彻底。
| 通道 A · 多用户会话 | 通道 B · 独立配置目录 | |
|---|---|---|
| 适用软件面 | 几乎全部 | 仅自支持参数的(Electron / Chromium 系为主) |
| 安装位置要求 | 必须全机可读 | 无要求 |
| 注册表隔离 | 天然分离 | 通常不隔离 |
| 需要密码 | 需要(首次配好后免密) | 不需要 |
| 能开几个 | 1 个账户 = 1 个实例 | 加参数即可,任意多个 |
| 登录态 | 各自独立 | 各自独立 |
现有工具全是"针对某一款软件硬编码"。twinlaunch 的区别在于先把软件摸清楚,再决定方法。
探测分三层:
| 层 | 探什么 | 判据举例 |
|---|---|---|
| 内核 | 是不是 Electron / Chromium | 同级或子目录存在 icudtl.dat、*.pak、libEGL.dll、resources\app.asar |
| 安装 | 第二账户能否访问 | exe 是否在 Program Files / ProgramData 下;否则查目录 ACL 是否给 BUILTIN\Users 读+执行 |
| 单实例 | 锁是会话级还是全局级 | 枚举运行中进程的句柄,看 Mutant 对象名是 Local\ 还是 Global\ |
探测产出「软件画像」,决策层按画像给出结论:
| 结论 | 含义 |
|---|---|
| 绿 · 走 A | 装在 Program Files 的原生程序,直接多用户双开 |
| 绿 · 走 B | Electron 系,用独立配置目录,更轻更干净 |
| 黄 | 能做,但有前置条件(要先修目录权限、或参数是否生效需要实测确认) |
| 红 | 本工具帮不上(需要提权 / 有内核驱动或反作弊 / 装在某个账户独占的私有目录) |
画像长这样:
{
"name": "QQ",
"exe": "C:\\Program Files\\Tencent\\QQNT\\QQ.exe",
"kernel": {
"type": "electron",
"confidence": "high",
"evidence": [
"versions\\9.9.33-52230\\icudtl.dat",
"versions\\9.9.33-52230\\resources\\app.asar"
],
"note": "顶层 QQ.exe 只是启动壳,Electron 负载在 versions\\<ver>\\ 下"
},
"install": {
"scope": "machine",
"dir": "C:\\Program Files\\Tencent\\QQNT",
"users_readable": true,
"evidence": "继承自 C:\\Program Files 的 BUILTIN\\Users:(RX)"
},
"single_instance": {
"mechanism": ["named_mutex"],
"namespace": "session",
"confidence": "medium",
"note": "非提权进程可能读不到内核对象名,需按类型统计 + 存活判定兜底"
},
"verdict": {
"level": "green",
"recommend": "B",
"fallback": "A",
"reason": "Electron 内核对 --user-data-dir 支持概率高,且不占用第二个账户"
}
}静态探测只能给候选,实测才是定论。 Electron 应用完全可能在启动早期把 userData 路径硬编码写死,让命令行参数失效——这种情况下参数法会"看起来支持、实际第二个实例秒退"。因此通道 B 落地前必须跑一次实测:带参数启动一个、再启动第二个、观察第二个是否存活。这一段就是项目的最小验证闭环。
两条通道都已有成熟项目,但都是单软件专用。详见 docs/PRIOR-ART.md。
| 通用(不绑定某款软件) | 覆盖通道 A | 覆盖通道 B | 自动选通道 | 需注入/驱动 | |
|---|---|---|---|---|---|
| twinlaunch | 是 | 是 | 是 | 是 | 否 |
| Sandboxie-Plus | 是 | 否(沙箱) | 否 | 否 | 是(内核驱动) |
| 通用"多开大师"类 | 是 | 部分 | 否 | 否 | 常需注入 |
| Zoltak-Dev/ai-multi-instance | 否(Claude/Codex) | 否 | 是 | 否 | 否 |
| XueYeHuLabs/Products | 是 | 是 | 否 | 否 | 否 |
| edgar0407/D2R-Multi-Instance | 否(暗黑2) | 是 | 否 | 否 | 否 |
空白点就是"自动选通道":没有任何一个项目在拉起实例之前,先判断这个软件该用哪种隔离。
- 不注入、不挂钩、不装驱动。 只用进程创建、句柄查询、COM 快捷方式这些文档化的公开接口。不碰游戏和聊天软件的内存,不给杀软留下把柄。
- 零依赖。 目标是不需要 pip install、不需要装运行时,拷过去就能跑。
- 探测阶段只读。 扫描软件不修改任何文件、注册表或系统配置;产生副作用(建图标、建目录)必须由你点。
- 先说清楚,再动手。 任何可能影响账号安全或系统状态的操作,都先在界面上把结论和理由讲明白,而不是默默执行。
| 里程碑 | 内容 | 验收标准 |
|---|---|---|
| M0 探测 CLI | 只读扫描任意 exe,输出软件画像与通道建议 | 对 QQNT / WorkBuddy / 原生程序各输出正确结论 |
| M1 通道 A 可用 | 生成 XXX (双开).lnk,免密拉起第二实例 |
双击图标直接开出第二个实例,不弹密码框 |
| M2 通道 B 可用 | 独立配置目录 + 动态实测校验 | Electron 软件双开成功,且实测结论与探测一致 |
| M3 图形界面 | 软件列表、搜索、自检报告、图标管理 | 全流程无需命令行 |
| M4 进阶 | 多账户 N 开、便携模式、图标批量迁移 | — |
先跑通最小闭环,再叠功能。 M0 是目前唯一确定要做的事——它零副作用,且结论直接影响后面所有设计。
- Windows 10 / 11
- 通道 A 需要系统里已有一个可用的本地账户(标准用户即可,不需要管理员权限)
- 不需要管理员权限运行,不需要关闭杀毒软件
仓库的设计/文档部分(两条通道、探测决策)是远期目标的沉淀;可直接用的代码在 legacy/ —— 一套 VBS + cmd 的脚本方案,已实测跑通 QQ 双开。README 之外的细节见那里。
- 用第三方方式多开软件可能违反该软件的服务条款,极端情况下可能导致账号被限制。是否使用、用在哪个软件上,请自行判断并承担后果。
- 本项目不绕过任何反作弊、不修改目标程序、不读取目标程序的内存或数据。
- 本项目与任何商业"多开器"无关,不含任何广告、推广或捆绑组件。