#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")