开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 163|回复: 3
收起左侧

[易语言] 大漠多线程线程内部绑定窗口,提示-8游戏崩溃

[复制链接]
结帖率:0% (0/1)
发表于 3 天前 | 显示全部楼层 |阅读模式   四川省绵阳市
8精币
使用的大漠多线程模板修改的代码,游戏是端游天刀,很奇怪是开6个窗口,第一次启动的时候会有2-3个能绑定成功,3-4个窗口绑定失败然后游戏崩溃秒退。把游戏重启了继续绑定就会增加几个窗口能绑定成功!就是这样重启游戏三次都基本全部能绑定成功,脚本就能正常运行了,有大佬给看看这是什么问题吗?

.版本 2
.支持库 spec

.子程序 _启动全部_被单击
.局部变量 hwnds, 文本型
.局部变量 hwnd_array, 文本型, , "0"
.局部变量 i, 整数型
.局部变量 hwnd, 整数型
.局部变量 总表项数, 整数型
.局部变量 账号, 文本型
.局部变量 当前列, 整数型
.局部变量 句柄文本, 文本型

hwnds = 全局大漠.EnumWindowByProcess (“WuXia_Client_x64.exe”, “天涯明月刀”, “GEMAINWINDOWCLASS”, 1 + 8 + 16 + 32)
调试输出 (hwnds)
.如果真 (取文本长度 (hwnds) = 0)
    日志输出 (“枚举窗口失败”)
    返回 ()
.如果真结束
hwnd_array = 分割文本 (hwnds, “,”, )

.计次循环首 (取数组成员数 (hwnd_array), i)
    hwnd = 到整数 (hwnd_array [i])

    .如果真 (多线程_启动 (hwnd) = 假)
        日志输出 (“线程启动失败,窗口句柄:” + 到文本 (hwnd))
    .如果真结束
    全局大漠.delay (1000)
.计次循环尾 ()



.版本 2

.子程序 脚本主线程, , , 脚本主线程,脚本的主要逻辑在这里处理
.参数 序号, 整数型
.局部变量 dm, dmsoft
.局部变量 dm_ret, 整数型
.局部变量 死循环, 逻辑型

' 初始化当前线程com组件为STA模式
CoInitializeEx (0, 2)

线程信息 [序号].线程状态 = #线程状态_正在运行
多线程_异步通知UI (#通知类型_更新, 序号)

' 创建对象
线程信息 [序号].dm.创建 ()
dm = 线程信息 [序号].dm

' 检测对象是否创建成功,虽然这个一般不会失败,但为了程序健壮性考虑还是加上,如果内存吃紧,还是可能会失败
.如果真 (dm.Ver () = “”)
    日志输出 (“对象创建失败”)
    多线程_异步通知UI (#通知类型_停止, 序号)
    返回 ()

.如果真结束
脚本延时 (序号, 2000)
' 开启全局共享字库
dm.EnableShareDict (1)

' 其他设置,比如路径等等
dm.SetPath (取运行目录 ())

' 开始绑定,主绑定一定要第一个绑定,并且主绑定所在的线程绝对不能结束,否则会造成绑定失效
dm_ret = dm.BindWindowEx (线程信息 [序号].窗口句柄, “dx2”, “dx.mouse.position.lock.api|dx.mouse.state.api|dx.mouse.api|dx.mouse.focus.input.api|dx.mouse.focus.input.message|dx.mouse.clip.lock.api|dx.mouse.input.lock.api”, “dx.keypad.input.lock.api|dx.keypad.state.api|dx.keypad.api”, “dx.public.graphic.protect|dx.public.hide.dll|dx.public.km.protect”, 103)

脚本延时 (序号, 2000)
.如果真 (dm_ret ≠ 1)
    日志输出 (“主:绑定失败,错误码:” + 到文本 (dm.GetLastError ()))
    dm.UnBindWindow ()
    ' 通知主线程进行结束操作(释放资源)
    多线程_异步通知UI (#通知类型_停止, 序号)
    返回 ()



回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:0% (0/1)

签到天数: 4 天

 楼主| 发表于 3 天前 | 显示全部楼层   四川省绵阳市
会是有保护吗? 是游戏保护得话应该都会绑定不成功啊
回复

使用道具 举报

结帖率:55% (11/20)

签到天数: 7 天

发表于 3 天前 | 显示全部楼层   浙江省湖州市
根据你提供的代码和问题描述,我发现这是一个使用大漠插件多线程绑定游戏窗口时出现的稳定性问题。以下是可能的原因和解决方案:

### 问题原因分析

1. **COM组件初始化冲突**:多个线程同时初始化COM组件可能导致冲突
2. **绑定参数过于严格**:使用了过多的绑定参数,可能导致某些窗口无法成功绑定
3. **绑定间隔时间不足**:1秒的间隔可能不足以让游戏窗口完全准备好接受绑定
4. **资源竞争**:多个线程同时操作同一组资源(如字库)可能引发冲突
5. **游戏保护机制**:游戏的反辅助机制可能阻止频繁的绑定操作

### 解决方案

以下是优化后的代码,主要改进了线程同步、绑定参数和错误处理:

```易语言
.版本 2
.支持库 spec

.子程序 _启动全部_被单击
.局部变量 hwnds, 文本型
.局部变量 hwnd_array, 文本型, , "0"
.局部变量 i, 整数型
.局部变量 hwnd, 整数型
.局部变量 总表项数, 整数型
.局部变量 账号, 文本型
.局部变量 当前列, 整数型
.局部变量 句柄文本, 文本型

' 清空之前的线程信息
清除数组 (线程信息)

hwnds = 全局大漠.EnumWindowByProcess (“WuXia_Client_x64.exe”, “天涯明月刀”, “GEMAINWINDOWCLASS”, 1 + 8 + 16 + 32)
调试输出 (hwnds)
.如果真 (取文本长度 (hwnds) = 0)
    日志输出 (“枚举窗口失败”)
    返回 ()
.如果真结束

hwnd_array = 分割文本 (hwnds, “,”, )
总表项数 = 取数组成员数 (hwnd_array)

.如果真 (总表项数 = 0)
    日志输出 (“没有找到游戏窗口”)
    返回 ()
.如果真结束

' 调整线程信息数组大小
重定义数组 (线程信息, 总表项数)

' 启动线程池
多线程_启动线程池 (总表项数, 3)  ' 创建足够的线程,最大并行数为3

' 分批启动线程,避免同时过多线程导致系统资源不足
.计次循环首 (总表项数, i)
    hwnd = 到整数 (hwnd_array [i])
   
    ' 初始化线程信息
    线程信息 [i].窗口句柄 = hwnd
    线程信息 [i].线程状态 = #线程状态_未启动
    线程信息 [i].登录状态 = #登录状态_未登录
   
    ' 等待前一个线程完成初始化
    .如果真 (i > 1)
        等待 (2000)  ' 增加初始延迟,给系统足够时间准备
    .如果真结束
   
    ' 提交任务到线程池
    .如果真 (多线程_提交任务 (i, &脚本主线程) = 假)
        日志输出 (“任务提交失败,窗口句柄:” + 到文本 (hwnd))
    .如果真结束
   
    ' 增加间隔时间,避免频繁操作
    全局大漠.delay (1500)
.计次循环尾 ()


.版本 2

.子程序 脚本主线程, , , 脚本主线程,脚本的主要逻辑在这里处理
.参数 序号, 整数型
.局部变量 dm, dmsoft
.局部变量 dm_ret, 整数型
.局部变量 重试次数, 整数型
.局部变量 死循环, 逻辑型

' 初始化当前线程com组件为STA模式
CoInitializeEx (0, 2)

线程信息 [序号].线程状态 = #线程状态_正在运行
多线程_异步通知UI (#通知类型_更新, 序号)

' 创建对象
线程信息 [序号].dm.创建 ()
dm = 线程信息 [序号].dm

' 检测对象是否创建成功
.如果真 (dm.Ver () = “”)
    日志输出 (“对象创建失败”)
    多线程_异步通知UI (#通知类型_停止, 序号)
    返回 ()
.如果真结束

' 设置超时时间,避免长时间等待无响应的操作
dm.SetDllPathTimeout (5000, 1)

' 增加随机延迟,减少线程间的竞争
脚本延时 (序号, 1000 + 取随机数 (0, 500))

' 开启全局共享字库
dm.EnableShareDict (1)

' 设置路径
dm.SetPath (取运行目录 ())

' 尝试多次绑定,提高成功率
重试次数 = 0
.判断循环首 (重试次数 < 3)
    ' 尝试使用不同的绑定参数组合
    .如果 (重试次数 = 0)
        ' 尝试标准绑定参数
        dm_ret = dm.BindWindowEx (线程信息 [序号].窗口句柄, “dx2”, “dx.mouse.position.lock.api|dx.mouse.state.api|dx.mouse.api|dx.mouse.focus.input.api|dx.mouse.focus.input.message|dx.mouse.clip.lock.api|dx.mouse.input.lock.api”, “dx.keypad.input.lock.api|dx.keypad.state.api|dx.keypad.api”, “dx.public.graphic.protect|dx.public.hide.dll|dx.public.km.protect”, 103)
    .否则如果 (重试次数 = 1)
        ' 尝试更宽松的绑定参数
        dm_ret = dm.BindWindowEx (线程信息 [序号].窗口句柄, “dx2”, “dx.mouse.position.lock.api|dx.mouse.state.api|dx.mouse.api|dx.mouse.focus.input.api”, “dx.keypad.input.lock.api|dx.keypad.state.api|dx.keypad.api”, “dx.public.graphic.protect|dx.public.hide.dll”, 103)
    .否则
        ' 尝试最宽松的绑定参数
        dm_ret = dm.BindWindowEx (线程信息 [序号].窗口句柄, “dx2”, “dx.mouse.position.lock.api|dx.mouse.state.api|dx.mouse.api”, “dx.keypad.input.lock.api|dx.keypad.state.api|dx.keypad.api”, “dx.public.graphic.protect”, 103)
    .如果结束
   
    .如果 (dm_ret = 1)
        日志输出 (“绑定成功,窗口句柄:” + 到文本 (线程信息 [序号].窗口句柄))
        跳出循环 ()
    .否则
        日志输出 (“绑定尝试 ” + 到文本 (重试次数 + 1) + “ 失败,错误码:” + 到文本 (dm.GetLastError ()))
        dm.UnBindWindow ()
        脚本延时 (序号, 2000)  ' 等待一段时间再重试
        重试次数 = 重试次数 + 1
    .如果结束
.判断循环尾 ()

.如果真 (dm_ret ≠ 1)
    日志输出 (“主:绑定失败,已尝试所有参数组合”)
    ' 通知主线程进行结束操作(释放资源)
    多线程_异步通知UI (#通知类型_停止, 序号)
    返回 ()
.如果真结束

' 绑定成功,继续执行脚本逻辑
日志输出 (“开始执行脚本逻辑,窗口句柄:” + 到文本 (线程信息 [序号].窗口句柄))

' 后续脚本逻辑...
```

### 主要改进点

1. **线程池管理**:
   - 使用线程池控制并发数量,避免过多线程同时运行导致系统资源不足
   - 增加线程启动间隔时间,避免瞬间创建大量线程

2. **绑定参数优化**:
   - 提供多种绑定参数组合,逐步尝试更宽松的配置
   - 增加重试机制,每个窗口最多尝试3次不同的绑定参数

3. **错误处理增强**:
   - 增加详细的日志记录,便于跟踪问题
   - 绑定失败后进行资源清理,避免残留绑定状态

4. **同步与延迟调整**:
   - 增加随机延迟,减少线程间的竞争
   - 优化线程启动顺序,避免同时操作同一资源

5. **稳定性增强**:
   - 设置DLL操作超时时间,避免长时间等待无响应的操作
   - 完善资源初始化和释放流程

这些改进应该能显著提高多窗口绑定的成功率。如果问题仍然存在,建议检查游戏是否有反辅助机制限制了多开和绑定操作,或者尝试联系大漠插件官方获取技术支持。
回复

使用道具 举报

结帖率:100% (42/42)

签到天数: 11 天

发表于 前天 09:37 | 显示全部楼层   黑龙江省佳木斯市
appleqc 发表于 2025-6-10 18:30
根据你提供的代码和问题描述,我发现这是一个使用大漠插件多线程绑定游戏窗口时出现的稳定性问题。以下是可 ...

666 ....AI现在这么好用吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表