写魔域按键精灵脚本,核心就两件事:让脚本找到游戏窗口,然后模拟人的操作去执行任务。下面把几个关键步骤和实际能跑的代码拆开讲。
**第一步:获取游戏窗口句柄**
脚本要操作游戏,得先知道操作哪个窗口。用插件命令找到标题带“魔域”字样的窗口,拿到它的句柄。句柄就像一个门牌号,有了它脚本才能往那个窗口发指令。
```
Hwnd = Plugin.Window.Find(0, "【魔域】")
```
这行代码的意思是:在整个系统中找标题为“【魔域】”的顶层窗口。如果游戏窗口标题有变化,比如叫“魔域-某某区”,就把引号里的内容改成实际标题就行。
**第二步:获取子窗口句柄**
魔域的游戏界面里,实际能接收鼠标点击的区域可能不是主窗口本身,而是它里面的子窗口。用`Plugin.Window.FindEx`可以从主窗口往下找,拿到真正能操作的那个子窗口句柄。
```
hwnd1 = Plugin.Window.FindEx(hwnd, 0, 0, 0)
```
**第三步:写一个自动寻路的子程序**
拿到句柄之后,就可以写功能了。下面这段代码是一个自动寻路到指定坐标的子程序,核心逻辑是:先读取当前坐标,然后判断是否已经到达目标点,没到的话就计算屏幕上的点击位置并模拟点击。
```
Sub 寻路(a,b)
Do
Call 当前坐标
If 第一坐标 = a and 第二坐标 = b Then
Exit Do
Else
Call 移动(a, b, 距离)
Delay 50
End If
loop
End Sub
```
**第四步:计算屏幕坐标并模拟点击**
游戏里的地图坐标和屏幕像素坐标不是一回事,需要换算。下面的代码把游戏坐标换算成屏幕上的点击位置,然后用`Plugin.Bkgnd.LeftClick`向子窗口发送左键点击指令,这个操作是后台的,不需要把游戏窗口激活也能执行。
```
Sub 移动(目标X, 目标Y, 距离)
当前X = 坐标1
当前Y = 坐标2
If (Abs(当前X - 目标X)) + (Abs(当前Y - 目标Y)) > 距离 Then
Do While (Abs(当前X - 目标X)) + (Abs(当前Y - 目标Y)) > 距离
HX = (512 + ((目标X - 当前X) * 32)) - (((目标Y - 当前Y) * 32))
HY = (384 + ((目标X - 当前X) * 16)) + (((目标Y - 当前Y) * 16))
Call Plugin.Bkgnd.LeftClick(hwnd1, HX, HY)
Loop
End If
End Sub
```
**第五步:读取当前坐标**
寻路之前得知道自己现在在哪。魔域游戏界面上有显示当前坐标的小窗口,可以通过读取那个窗口里的文字来获取坐标值。`Plugin.Window.GetText`可以读取指定窗口的文本内容,然后用`Mid`函数截取出坐标数字部分。
```
Sub 当前坐标
HwndArray = Plugin.WndEx6.EnumWindowA(hwnd , "自动寻路", 0, 1)
if UBound(HwndArray) > -1 then
x1 = Plugin.WndEx6.GetWindow(HwndArray(0), 5)
Hv = Plugin.WndEx6.GetWindow(HwndArray(0), 5)
x2 = Plugin.WndEx6.GetWindow(Hv, 5)
xu1 = Plugin.Window.GetText(x1)
xu2 = Plugin.Window.GetText(x2)
坐标1 = Mid(xu2, 15, 19) + 0
坐标2 = Mid(xu1, 15, 19) + 0
end if
End Sub
```
把这几个部分组合起来,调用`Call 寻路(921, 994)`就能让角色自动走到指定坐标点。其他功能比如自动打怪、自动喝药、自动捡物,思路是一样的:获取窗口句柄、找色找图判断状态、模拟键盘鼠标操作。按键精灵自带的录制功能也能生成基础脚本,但录制的脚本稳定性不高,容易出错,直接写代码反而更可靠。
**第一步:获取游戏窗口句柄**
脚本要操作游戏,得先知道操作哪个窗口。用插件命令找到标题带“魔域”字样的窗口,拿到它的句柄。句柄就像一个门牌号,有了它脚本才能往那个窗口发指令。
```
Hwnd = Plugin.Window.Find(0, "【魔域】")
```
这行代码的意思是:在整个系统中找标题为“【魔域】”的顶层窗口。如果游戏窗口标题有变化,比如叫“魔域-某某区”,就把引号里的内容改成实际标题就行。
**第二步:获取子窗口句柄**
魔域的游戏界面里,实际能接收鼠标点击的区域可能不是主窗口本身,而是它里面的子窗口。用`Plugin.Window.FindEx`可以从主窗口往下找,拿到真正能操作的那个子窗口句柄。
```
hwnd1 = Plugin.Window.FindEx(hwnd, 0, 0, 0)
```
**第三步:写一个自动寻路的子程序**
拿到句柄之后,就可以写功能了。下面这段代码是一个自动寻路到指定坐标的子程序,核心逻辑是:先读取当前坐标,然后判断是否已经到达目标点,没到的话就计算屏幕上的点击位置并模拟点击。
```
Sub 寻路(a,b)
Do
Call 当前坐标
If 第一坐标 = a and 第二坐标 = b Then
Exit Do
Else
Call 移动(a, b, 距离)
Delay 50
End If
loop
End Sub
```
**第四步:计算屏幕坐标并模拟点击**
游戏里的地图坐标和屏幕像素坐标不是一回事,需要换算。下面的代码把游戏坐标换算成屏幕上的点击位置,然后用`Plugin.Bkgnd.LeftClick`向子窗口发送左键点击指令,这个操作是后台的,不需要把游戏窗口激活也能执行。
```
Sub 移动(目标X, 目标Y, 距离)
当前X = 坐标1
当前Y = 坐标2
If (Abs(当前X - 目标X)) + (Abs(当前Y - 目标Y)) > 距离 Then
Do While (Abs(当前X - 目标X)) + (Abs(当前Y - 目标Y)) > 距离
HX = (512 + ((目标X - 当前X) * 32)) - (((目标Y - 当前Y) * 32))
HY = (384 + ((目标X - 当前X) * 16)) + (((目标Y - 当前Y) * 16))
Call Plugin.Bkgnd.LeftClick(hwnd1, HX, HY)
Loop
End If
End Sub
```
**第五步:读取当前坐标**
寻路之前得知道自己现在在哪。魔域游戏界面上有显示当前坐标的小窗口,可以通过读取那个窗口里的文字来获取坐标值。`Plugin.Window.GetText`可以读取指定窗口的文本内容,然后用`Mid`函数截取出坐标数字部分。
```
Sub 当前坐标
HwndArray = Plugin.WndEx6.EnumWindowA(hwnd , "自动寻路", 0, 1)
if UBound(HwndArray) > -1 then
x1 = Plugin.WndEx6.GetWindow(HwndArray(0), 5)
Hv = Plugin.WndEx6.GetWindow(HwndArray(0), 5)
x2 = Plugin.WndEx6.GetWindow(Hv, 5)
xu1 = Plugin.Window.GetText(x1)
xu2 = Plugin.Window.GetText(x2)
坐标1 = Mid(xu2, 15, 19) + 0
坐标2 = Mid(xu1, 15, 19) + 0
end if
End Sub
```
把这几个部分组合起来,调用`Call 寻路(921, 994)`就能让角色自动走到指定坐标点。其他功能比如自动打怪、自动喝药、自动捡物,思路是一样的:获取窗口句柄、找色找图判断状态、模拟键盘鼠标操作。按键精灵自带的录制功能也能生成基础脚本,但录制的脚本稳定性不高,容易出错,直接写代码反而更可靠。

