autool-dispatcher/scripts/mumu_restore_v2.ahk
2026-06-17 19:50:39 +08:00

145 lines
4.9 KiB
AutoHotkey
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Requires AutoHotkey v2.0
;@Ahk2Exe-ConsoleApp
#SingleInstance Force
; 在脚本开头尝试附加到启动它的命令行控制台 (cmd 或 PowerShell)
; -1 表示附加到父进程的控制台
;try DllCall("AttachConsole", "Int", -1)
SendMode("Input")
SetWorkingDir(A_ScriptDir)
FileEncoding("UTF-8-RAW")
CoordMode("Mouse", "Screen")
DetectHiddenWindows(true)
DetectHiddenText(true)
; ============================================================
; 命令行参数:
; A_Args[1] - 备份文件路径 (默认 D:\mumu_backups\taskagent.mumudata)
; A_Args[2] - VM 索引 (可选, 默认 2)
;
; 用法:
; mumu_restore_v2.exe "D:\mumu_backups\taskagent.mumudata" 2
;
; 返回值:
; 0 = 成功, 1 = 失败
; ============================================================
backupFile := A_Args.Length >= 1 ? A_Args[1] : "D:\mumu_backups\taskagent.mumudata"
vmIndex := A_Args.Length >= 2 ? A_Args[2] : 2
resultFile := A_Args.Length >= 3 ? A_Args[3] : "D:\mumu_backups\result.txt"
if !backupFile {
FileAppend("[ERROR] Missing backup file argument`n", "*")
ExitApp(1)
}
if !FileExist(backupFile) {
FileAppend("[ERROR] Backup file not found: " backupFile "`n", "*")
ExitApp(1)
}
; ---------- MuMu 管理器信息 (用 Window Spy 抓取后填入) ----------
MuMuNxMainTitle := "ahk_class Qt5156QWindowIcon" ; 如 "ahk_class Qt5QWindowIcon"
MuMuNxMainPath := "C:\Program Files\Netease\MuMu\nx_main\MuMuNxMain.exe"
; ---------- 超时设置 ----------
IMPORT_TIMEOUT_SECONDS := 900 ; 导入最大等待时间 (15 分钟)
WINDOW_WAIT_SECONDS := 30 ; 等待窗口出现的最大时间
; ============================================================
; 辅助函数
; ============================================================
WriteResult(content) {
global resultFile
try {
; 建议在 v2 中先判断文件是否存在因为如果文件被占用导致删除失败v2 会抛出严重错误
if FileExist(resultFile) {
FileDelete(resultFile)
}
; 参数需要用括号,文本编码等字符串需要用双引号
FileAppend(content, resultFile, "UTF-8-RAW")
} catch {
; 字符串和变量之间通过空格拼接,向控制台输出的星号 "*" 也需要加双引号
FileAppend("FAIL: Cannot write result file: " resultFile "`n", "*")
}
}
; ============================================================
; 主流程
; ============================================================
; 1. 启动 MuMu 管理器
; TODO: 如果管理器已在运行, 先关闭再重新打开, 保证窗口状态干净
ProcessClose("MuMuNxMain.exe")
Sleep(2000)
Run('"' MuMuNxMainPath '"')
; 2. 等待管理器窗口出现
if !WinWait(MuMuNxMainTitle, , WINDOW_WAIT_SECONDS)
WriteResult("FAIL: MuMu manager window did not appear within " WINDOW_WAIT_SECONDS "s")
WinActivate(MuMuNxMainTitle)
Sleep(2000)
; 3. 导入备份文件
; TODO: 根据实际录制结果替换下方的坐标 / 操作步骤
; 典型流程:
; a) 点击 "导入" 按钮 (或 菜单 -> 导入)
; b) 在弹出的文件选择对话框中输入备份文件路径并确认
; c) 等待导入进度条完成
; 最大化窗口 移动到左上角
WinMaximize
WinSetAlwaysOnTop(1, MuMuNxMainTitle)
; --- 步骤 a: 点击导入按钮 ---
Click(810, 420)
Sleep(1000)
Click(860, 608)
Sleep(1000)
CoordMode("Mouse", "Screen")
Click(600, 338)
; --- 步骤 b: 文件选择对话框 (通常是 Windows 通用对话框) ---
; 方式1: 如果支持直接输入路径 (推荐, 比逐级浏览更稳定)
Sleep(1000)
dialogWin := "选择备份文件 ahk_class #32770 ahk_exe MuMuNxMain.exe"
; 3. 激活该窗口并等待其完全激活
WinActivate(dialogWin)
WinWaitActive(dialogWin)
;WinSetAlwaysOnTop(1, dialogWin)
; --- 进阶技巧:直接把文件路径填进去,而不是模拟键盘敲字 ---
; 在标准的文件对话框中,输入文件名的文本框控件名称通常是 "Edit1"
; 直接设置文本(比用 Send 发送按键更稳定,不受输入法干扰)
ControlSetText(backupFile, "Edit1", dialogWin)
; 短暂延迟,确保系统反应过来
Sleep(200)
; 4. 点击“打开”按钮 (默认的打开按钮控件通常是 "Button1")
ControlClick("Button1", dialogWin)
Send("{Enter}")
; --- 步骤 c: 等待导入完成 ---
; 方式C - 检测按钮状态 (如 "完成" 按钮出现):
WinActivate(MuMuNxMainTitle)
WinSetAlwaysOnTop(1, MuMuNxMainTitle)
CoordMode("Mouse", "Client")
importDeadline := A_TickCount + IMPORT_TIMEOUT_SECONDS * 1000
Loop {
WinActivate(MuMuNxMainTitle)
color := PixelGetColor(568,427, "RGB")
try FileAppend("[color] " color "`n", "*")
if color = 0x0F7B0F
break
if A_TickCount > importDeadline
WriteResult("FAIL: Import timed out")
Sleep(2000)
}
; 4. 导入完成后, 点击忽略, 关闭管理器
Click(600, 440)
Sleep(200)
WinClose(MuMuNxMainTitle)
WriteResult("OK")