传奇后台喊话回车只发一次:句柄/焦点/延迟三处错

来源: 作者: 点击:
你这个现象不是“回车只按了一次”,而是第一次回车把聊天框打开,SendString 把字塞进去了,第二次回车游戏没当成“发送”。记事本能跑,是因为记事本老老实实收 WM_KEYDOWN/WM_KEYUP;传奇客户端是自有消息循环,对后台 KeyPress 13 的处理不一样。

先说你原脚本的问题:

Call Plugin.Bkgnd.KeyPress(Hwnd, 13) '1 打开聊天框
Delay 1000
Call Plugin.Bkgnd.SendString(Hwnd, hua) '2 发字到主窗口,不是聊天输入框
Delay 1000
Call Plugin.Bkgnd.KeyPress(Hwnd, 13) '3 游戏可能已经关框/没焦点,等于白按


三个坑:
1. Hwnd 用 MousePoint 拿的是“鼠标底下那个窗口”,不一定是能收聊天输入的窗口;传奇有主窗口、子窗口、DX 画布,句柄不对,第二次回车就喂空气。
2. 第一次回车后聊天框要时间弹出来,1 秒在某些机器/服里不够,SendString 发到主窗口而不是编辑框,字可能没进输入框。
3. 传奇对后台模拟回车敏感,KeyPress 一下按下+松开太“机器”,第二次容易被客户端当无效输入吞掉。

改法一:加延迟 + 激活窗口 + KeyDown/KeyUp

Hwnd = Plugin.Window.MousePoint()
hua = "喊话内容"
times = 100
Gap = 5000

For i = 1 To times
Call Plugin.Window.Active(Hwnd)
Delay 300

Call Plugin.Bkgnd.KeyDown(Hwnd, 13)
Delay 80
Call Plugin.Bkgnd.KeyUp(Hwnd, 13)
Delay 1800 '等聊天框真的出来

Call Plugin.Bkgnd.SendString(Hwnd, hua)
Delay 800

Call Plugin.Bkgnd.KeyDown(Hwnd, 13)
Delay 80
Call Plugin.Bkgnd.KeyUp(Hwnd, 13)
Delay Gap
Next

KeyDown/KeyUp 比 KeyPress 更接近真按键,传奇吃这个概率高一点。

改法二:先发 / 或回车进说话模式,再填字
传奇里聊天框有时候要先处于“说话/命令”状态:

Call Plugin.Bkgnd.SendString(Hwnd, "/")
Delay 400
Call Plugin.Bkgnd.KeyPress(Hwnd, 13)
Delay 1500
Call Plugin.Bkgnd.SendString(Hwnd, hua)
Delay 800
Call Plugin.Bkgnd.KeyPress(Hwnd, 13)

这招在部分 HERO/LEGEND 客户端比“纯回车”稳。

改法三:别用主窗口句柄,找输入框/子窗口
用 Window Spy 或 Spy++ 看传奇是不是有 Edit 类子窗口:

Hwnd = Plugin.Window.Find("MirClient", 0)
EditHwnd = Plugin.Window.FindEx(Hwnd, 0, "Edit", 0)
If EditHwnd <> 0 Then
Call Plugin.Bkgnd.SendString(EditHwnd, hua)
Else
Call Plugin.Bkgnd.SendString(Hwnd, hua)
End If

有 Edit 句柄就往 Edit 发,没 Edit 再退回到主窗口发。

改法四:用 PostMessage 发 WM_KEYDOWN/WM_KEYUP(进阶)

Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const VK_RETURN = &HD

PostMessage Hwnd, WM_KEYDOWN, VK_RETURN, 0
Delay 100
PostMessage Hwnd, WM_KEYUP, VK_RETURN, 0

比 Bkgnd.KeyPress 更接近系统消息,但传奇 DX 模式也不一定收,属于“试了再说”。

还有几个隐藏雷:
• 中文输入法开着,后台发中文回车会跑进输入法候选框,进游戏变乱码/不发送。脚本跑之前切英文输入法。

- 全屏模式后台基本废,改窗口模式或窗口全屏。
• 喊话 2 秒一次太规律,登录器/反辅模块会掐你,间隔随机化:
Delay 3000 + Int(Rnd * 4000)

• hua = hua & i 每轮把上一条拼上去,第 50 次变成“喊话内容123...50”,字数爆了聊天框直接不发,看起来也像“第二次回车没用”。正确做法:

For i = 1 To times
cur = hua & i
...
Next


最小能用的修正版:

Hwnd = Plugin.Window.MousePoint()
BaseHua = "【收人】战战组合 攻沙送元宝 详情私聊 "
times = 50
For i = 1 To times
cur = BaseHua & "(" & i & "/" & times & ")"

Call Plugin.Window.Active(Hwnd)
Delay 500

Call Plugin.Bkgnd.KeyDown(Hwnd, 13)
Delay 100
Call Plugin.Bkgnd.KeyUp(Hwnd, 13)
Delay 2000

Call Plugin.Bkgnd.SendString(Hwnd, cur)
Delay 1000

Call Plugin.Bkgnd.KeyDown(Hwnd, 13)
Delay 100
Call Plugin.Bkgnd.KeyUp(Hwnd, 13)

Randomize
Delay 4000 + Int(Rnd * 4000)
Next


一句话:你原脚本“回车只按一次”是假象,真实情况是聊天框没拿到焦点 / 字没进输入框 / 第二次回车被传奇后台输入处理吞了。把激活窗口、加长延迟、KeyDown+KeyUp、字符串不累加、间隔随机化这五件事做掉,比换“喊话软件”有用。