145 lines
4.9 KiB
AutoHotkey
145 lines
4.9 KiB
AutoHotkey
#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")
|