本文面向梦幻西游手游时空客户端相关的桌面自动化开发与使用场景。金手指的判断依赖当前窗口截图、窗口矩形、模板文件和可复核日志,具体表现会受到客户端画面、Windows 缩放、窗口位置及运行权限影响。下面只讨论当前项目代码中已经存在的结构和排查方法,不把示意图冒充软件截图,也不虚构用户案例、排名、收录量或效果数据。关键内容即使不加载图片也能通过正文理解。
先确认跟踪的是同一个窗口
先确认跟踪的是同一个窗口
窗口移动后最先要确认的是句柄是否仍指向原来的客户区。多开环境里标题相近的窗口可能同时存在,不能只依靠标题文字判断。当前流程会围绕队长窗口和选定窗口保存句柄、矩形与前台状态,排查时应把这些字段放进同一条日志。若句柄已经变化,继续使用旧矩形得到的截图即使看起来相似,也不能作为后续点击依据。
窗口矩形必须在每轮重新读取
窗口外框、标题栏和客户区并不是同一个矩形。窗口被拖动、最大化或恢复后,外框位置与客户区原点都可能变化,因此每次识别前都应重新取得当前矩形,再按客户区范围截取。不要把上一次循环的左上角缓存成永久值;缓存可以减少重复查询,但不能跳过窗口状态变化后的重算。
相对坐标与屏幕坐标要分层
识别函数通常在窗口内部的相对区域上工作,点击函数则需要转换到屏幕坐标。正确链路应是相对区域加客户区原点,再叠加窗口边框或标题栏修正,最后得到屏幕点。若把外框坐标直接与客户区坐标相加,纵向偏移会稳定出现;若混入 DPI 缩放,横纵偏移还可能不一致。
识别框与点击点要同帧复核
识别框、预期点击点和最终鼠标点必须使用同一帧数据。窗口移动后先截图再移动,或先算点再等待其他窗口出现,都会让日志中的框和实际画面脱节。排查时保留截图时间、窗口矩形、搜索区域、匹配结果和最终点,先判断框是否正确,再判断坐标转换是否正确。
移动窗口后的最小复现方法
最小复现只保留一个目标窗口,固定缩放,记录窗口移动前后的矩形,分别截图并在图上标出客户区边界。先验证识别框能随窗口移动,再验证点击点能落在同一目标上,最后才恢复多开和任务流程。这样可以把句柄问题、区域问题、DPI问题和前台问题拆开,避免用固定偏移掩盖根因。

排查时建议一次只改变一个条件,并保留窗口矩形、截图时间、识别框、匹配分数和最终动作。若要了解窗口移动后的相对识别,可阅读窗口相对识别说明;需要了解多尺度模板时,可参考多尺度模板匹配实践。
复核记录怎么写
窗口跟踪的复核顺序还可以分成三个时间点:获得句柄时、开始截图时和准备输入时。三个时间点都记录矩形,若矩形变化却没有重新计算区域,问题出在状态刷新;若矩形一致而点击仍偏移,再检查客户区原点与 DPI;若点正确但动作没有反应,继续检查前台窗口与输入释放。
多开排查不要同时改变排列方式、缩放和模板。先把一个窗口移动到另一个位置,观察识别框是否跟随;再改变窗口尺寸,观察候选尺度;最后才接入队列。每一步都保留同一格式的日志,方便比较。
窗口移动后的最终检查要回到用户能看到的证据:当前窗口边界、目标区域和动作点是否在同一个画面语义中。只要其中一项来自旧截图,就应重新采集,而不是通过加减固定像素完成修补。\n\n本节内容应与实际运行日志一起核对,页面文字用于说明方法,具体结果以当前环境中的截图、窗口信息和代码行为为准。\n\n排查结束后再恢复完整任务链,先确认当前窗口、当前阶段与当前模板条件没有变化。\n\n实际发布前还要检查标题、摘要、canonical、封面图、图注、站内链接、移动端换行和页面 HTTP 状态,发布后的 URL 以站点返回结果为准。

