你这个现象不是“回车只按了一次”,而是第一次回车把聊天框打开,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&"/"×&")"
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、字符串不累加、间隔随机化这五件事做掉,比换“喊话软件”有用。
先说你原脚本的问题:
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&"/"×&")"
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、字符串不累加、间隔随机化这五件事做掉,比换“喊话软件”有用。

