你的原始脚本用 Window.MousePoint() 抓取鼠标指向的窗口句柄,这个做法有两个致命缺陷:一是必须让游戏窗口保持在前台可见,二是无法同时控制多个窗口。要实现"固定网页、网页隐藏也能自动运行、多个同时运行",需要把句柄获取方式改成按网页标题或类名绑定,并且用 Bkgnd 后台插件让操作完全在后台执行,不抢占前台焦点。
第一步:确定目标网页的唯一标识
打开你要挂机的网页游戏,用按键精灵的"抓抓"工具→窗口定位,查看该网页窗口的标题(Title)和类名(Class)。假设网页标题包含"传奇网页版"字样,类名为"Chrome_WidgetWin_1"(Chrome浏览器)或"IEFrame"(IE内核)。如果你的网页是独立客户端而非浏览器,类名可能是"TFrmMain"或"TMainForm"之类。记录下这两个值。
第二步:改写后的完整脚本(标题:传奇网页后台多开挂机脚本)
// 定义目标网页标题关键字(支持模糊匹配)
Dim TargetTitle = "传奇网页版"
// 枚举所有窗口,找到匹配标题的句柄列表
Plugin HwndList = Window.Search(TargetTitle)
// 判断是否找到至少一个匹配窗口
If HwndList(0) = "" Then
MessageBox "未找到标题包含 " & TargetTitle & " 的网页窗口,请确认游戏已打开"
EndScript
End If
// 遍历每一个匹配的窗口,分别执行挂机操作(多开)
Dim idx
For idx = 0 To UBOUND(HwndList) - 1
Dim hwnd = Clng(HwndList(idx))
// 检查窗口是否存在且有效
Plugin winExist = Window.IsVisible(hwnd)
If winExist = True Then
// 执行你的原始操作序列(坐标根据该网页的实际界面调整)
Call RunGameCycle(hwnd)
End If
Next
// 定义挂机循环函数
Sub RunGameCycle(hwnd)
// 第一次左键点击(例如点击开始按钮)
Plugin Bkgnd.LeftClick(hwnd, 500, 440)
Delay 54000
// 后续右键点击序列(坐标36,240 和 72,240 代表两个不同的功能按钮)
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
End Sub
// 循环执行(可设循环次数或无限循环)
Delay 1000
Goto 1
第三步:关键改动说明
Window.Search(TargetTitle) 替代 Window.MousePoint(),不再需要鼠标指向窗口,脚本自动按标题关键词找到所有符合条件的网页窗口。UBOUND(HwndList) 获取匹配窗口总数,For 循环逐个执行,实现多开。Bkgnd 系列命令(Bkgnd.LeftClick、Bkgnd.RightClick、Bkgnd.MoveTo)全程在后台操作,不抢夺鼠标焦点,你可以把网页最小化或隐藏在任务栏后面,脚本照样运行。IsVisible 检查窗口是否还存在,防止窗口关闭后脚本报错。
第四步:让你的脚本不跳出前台运行
原始脚本之所以"自动跳出运行的网页",是因为 Bkgnd 命令在某些情况下仍然会激活窗口。解决办法是在脚本开头加一行强制让所有匹配窗口保持隐藏状态:
Plugin Window.Min(hwnd) // 最小化窗口
或者在 RunGameCycle 函数内每次操作前先判断窗口是否被激活,如果是则立即最小化:
Plugin winState = Window.GetState(hwnd)
If winState <> 2 Then // 2表示最小化
Plugin Window.Min(hwnd)
End If
这样脚本全程在后台跑,网页窗口不会跳到前台干扰你其他工作。
第五步:多开时的注意事项
每个窗口的坐标(500,440 / 36,240 / 72,240)必须基于该网页的实际界面布局。如果你开了两个不同分辨率的浏览器窗口,坐标会偏移。解决方案:要么把所有窗口统一成相同尺寸(比如都用1920x1080的浏览器窗口),要么在脚本里加上 Window.GetClientRect(hwnd) 获取每个窗口的实际客户区宽高,按比例换算坐标。
第六步:完整的循环与退出机制
上面的脚本用 Goto 1 做无限循环,实际使用时建议加上循环次数限制或热键终止。在脚本开头定义:
Dim maxLoops = 100 // 最大循环次数
Dim loopCount = 0
然后在 For 循环结束后加 loopCount = loopCount + 1,并在 Goto 1 前判断 If loopCount >= maxLoops Then EndScript。这样脚本跑完预定次数自动停止,不会无限挂机。
第七步:调试与验证
写完脚本后,先在只有一个网页窗口的情况下运行,观察后台是否正常点击。用按键精灵的"调试"模式,在 Bkgnd.LeftClick 前后加 TracePrint 打印句柄值和坐标,确认操作确实发送到了正确的窗口。确认单窗口正常后,再打开第二个同标题网页测试多开。如果发现某个窗口没反应,检查该窗口的标题是否完全匹配 TargetTitle,有时浏览器会在标题后追加" - Google Chrome"之类后缀,需要把 TargetTitle 改成更精确的关键词或用 Window.Ex 系列函数按类名查找。
第一步:确定目标网页的唯一标识
打开你要挂机的网页游戏,用按键精灵的"抓抓"工具→窗口定位,查看该网页窗口的标题(Title)和类名(Class)。假设网页标题包含"传奇网页版"字样,类名为"Chrome_WidgetWin_1"(Chrome浏览器)或"IEFrame"(IE内核)。如果你的网页是独立客户端而非浏览器,类名可能是"TFrmMain"或"TMainForm"之类。记录下这两个值。
第二步:改写后的完整脚本(标题:传奇网页后台多开挂机脚本)
// 定义目标网页标题关键字(支持模糊匹配)
Dim TargetTitle = "传奇网页版"
// 枚举所有窗口,找到匹配标题的句柄列表
Plugin HwndList = Window.Search(TargetTitle)
// 判断是否找到至少一个匹配窗口
If HwndList(0) = "" Then
MessageBox "未找到标题包含 " & TargetTitle & " 的网页窗口,请确认游戏已打开"
EndScript
End If
// 遍历每一个匹配的窗口,分别执行挂机操作(多开)
Dim idx
For idx = 0 To UBOUND(HwndList) - 1
Dim hwnd = Clng(HwndList(idx))
// 检查窗口是否存在且有效
Plugin winExist = Window.IsVisible(hwnd)
If winExist = True Then
// 执行你的原始操作序列(坐标根据该网页的实际界面调整)
Call RunGameCycle(hwnd)
End If
Next
// 定义挂机循环函数
Sub RunGameCycle(hwnd)
// 第一次左键点击(例如点击开始按钮)
Plugin Bkgnd.LeftClick(hwnd, 500, 440)
Delay 54000
// 后续右键点击序列(坐标36,240 和 72,240 代表两个不同的功能按钮)
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 36, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.MoveTo(hwnd, 72, 240)
Delay 500
Plugin Bkgnd.RightClick(hwnd, 72, 240)
Delay 500
End Sub
// 循环执行(可设循环次数或无限循环)
Delay 1000
Goto 1
第三步:关键改动说明
Window.Search(TargetTitle) 替代 Window.MousePoint(),不再需要鼠标指向窗口,脚本自动按标题关键词找到所有符合条件的网页窗口。UBOUND(HwndList) 获取匹配窗口总数,For 循环逐个执行,实现多开。Bkgnd 系列命令(Bkgnd.LeftClick、Bkgnd.RightClick、Bkgnd.MoveTo)全程在后台操作,不抢夺鼠标焦点,你可以把网页最小化或隐藏在任务栏后面,脚本照样运行。IsVisible 检查窗口是否还存在,防止窗口关闭后脚本报错。
第四步:让你的脚本不跳出前台运行
原始脚本之所以"自动跳出运行的网页",是因为 Bkgnd 命令在某些情况下仍然会激活窗口。解决办法是在脚本开头加一行强制让所有匹配窗口保持隐藏状态:
Plugin Window.Min(hwnd) // 最小化窗口
或者在 RunGameCycle 函数内每次操作前先判断窗口是否被激活,如果是则立即最小化:
Plugin winState = Window.GetState(hwnd)
If winState <> 2 Then // 2表示最小化
Plugin Window.Min(hwnd)
End If
这样脚本全程在后台跑,网页窗口不会跳到前台干扰你其他工作。
第五步:多开时的注意事项
每个窗口的坐标(500,440 / 36,240 / 72,240)必须基于该网页的实际界面布局。如果你开了两个不同分辨率的浏览器窗口,坐标会偏移。解决方案:要么把所有窗口统一成相同尺寸(比如都用1920x1080的浏览器窗口),要么在脚本里加上 Window.GetClientRect(hwnd) 获取每个窗口的实际客户区宽高,按比例换算坐标。
第六步:完整的循环与退出机制
上面的脚本用 Goto 1 做无限循环,实际使用时建议加上循环次数限制或热键终止。在脚本开头定义:
Dim maxLoops = 100 // 最大循环次数
Dim loopCount = 0
然后在 For 循环结束后加 loopCount = loopCount + 1,并在 Goto 1 前判断 If loopCount >= maxLoops Then EndScript。这样脚本跑完预定次数自动停止,不会无限挂机。
第七步:调试与验证
写完脚本后,先在只有一个网页窗口的情况下运行,观察后台是否正常点击。用按键精灵的"调试"模式,在 Bkgnd.LeftClick 前后加 TracePrint 打印句柄值和坐标,确认操作确实发送到了正确的窗口。确认单窗口正常后,再打开第二个同标题网页测试多开。如果发现某个窗口没反应,检查该窗口的标题是否完全匹配 TargetTitle,有时浏览器会在标题后追加" - Google Chrome"之类后缀,需要把 TargetTitle 改成更精确的关键词或用 Window.Ex 系列函数按类名查找。

