当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

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

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

先说你原脚本的问题:

CallPlugin.Bkgnd.KeyPress(Hwnd13)'1打开聊天框
Delay1000
CallPlugin.Bkgnd.SendString(Hwndhua)'2发字到主窗口,不是聊天输入框
Delay1000
CallPlugin.Bkgnd.KeyPress(Hwnd13)'3游戏可能已经关框/没焦点,等于白按


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

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

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

Fori=1Totimes
CallPlugin.Window.Active(Hwnd)
Delay300

CallPlugin.Bkgnd.KeyDown(Hwnd13)
Delay80
CallPlugin.Bkgnd.KeyUp(Hwnd13)
Delay1800'等聊天框真的出来

CallPlugin.Bkgnd.SendString(Hwndhua)
Delay800

CallPlugin.Bkgnd.KeyDown(Hwnd13)
Delay80
CallPlugin.Bkgnd.KeyUp(Hwnd13)
DelayGap
Next

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

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

CallPlugin.Bkgnd.SendString(Hwnd"/")
Delay400
CallPlugin.Bkgnd.KeyPress(Hwnd13)
Delay1500
CallPlugin.Bkgnd.SendString(Hwndhua)
Delay800
CallPlugin.Bkgnd.KeyPress(Hwnd13)

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

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

Hwnd=Plugin.Window.Find("MirClient"0)
EditHwnd=Plugin.Window.FindEx(Hwnd0"Edit"0)
IfEditHwnd<>0Then
CallPlugin.Bkgnd.SendString(EditHwndhua)
Else
CallPlugin.Bkgnd.SendString(Hwndhua)
EndIf

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

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

ConstWM_KEYDOWN=&H100
ConstWM_KEYUP=&H101
ConstVK_RETURN=&HD

PostMessageHwndWM_KEYDOWNVK_RETURN0
Delay100
PostMessageHwndWM_KEYUPVK_RETURN0

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

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

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

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

Fori=1Totimes
cur=hua&i
...
Next


最小能用的修正版:

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

CallPlugin.Window.Active(Hwnd)
Delay500

CallPlugin.Bkgnd.KeyDown(Hwnd13)
Delay100
CallPlugin.Bkgnd.KeyUp(Hwnd13)
Delay2000

CallPlugin.Bkgnd.SendString(Hwndcur)
Delay1000

CallPlugin.Bkgnd.KeyDown(Hwnd13)
Delay100
CallPlugin.Bkgnd.KeyUp(Hwnd13)

Randomize
Delay4000+Int(Rnd*4000)
Next


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