2026-10-19 00:20 实测。进程YGOnline.exePID 10152(窗口标题orzo),CE 32 位附加。
控件池基址0x03C35758,内挂窗口对象0x58CA1008(每次启动都变)。
能识别,而且是精确识别,不是靠猜图。 靠的是控件对象里的三个字段:
| 字段 | 偏移 | 含义 | 怎么确认的 |
|---|---|---|---|
| 页号 | +0x048 | 该控件属于第几个标签页(0 基,按标签顺序) | 分组后:值 4 恰好 6 个、值 3 恰好 12 个、值 5 恰好 7+ 个,与截图元素数一一对应 |
| 坐标 | +0x028 X / +0x02C Y / +0x030 宽 / +0x034 高 | 面板内像素坐标 | 顶部 4 按钮横排 X 等距、Y 相同;70~82 一列 X 全 28、Y 步长 20;101~109 是 3×3 网格 |
| 名称 | +0x368 起内联 BIG5 | 控件的悬浮提示原文 | 直接读出来,如「啟動商人之魂。」「勾選後使用神獸時,會自動…」 |
其余已知字段:+0x000 虚表、+0x004 父对象、+0x00C 池索引、+0x360(byte) check、+0x364(dword) ID。
页号对照:0=攻擊、1=設定、2=恢復、3=輔助、4=回城、5=其他。<br>(0 这一组没被赋页号,混着所有共用控件,见第九、十节。)
控件坐标是面板内逻辑坐标,转屏幕像素:
屏幕 x = 0.85 × 控件X(顶部按钮,原点 = 面板左上角)
屏幕 y = 0.85 × 控件Y
实测校验(顶部 4 按钮):控件 X=136/161/186/211 → 屏幕中心 126/152/172/190,误差 ≤2px,按钮宽 24→20.4px 也吻合。
页面内容区(标签栏下方)另有固定偏移,约 +15, +21,因为它的原点是页面容器而不是面板。<br>做像素级标注时这个偏移必须逐页重标一次,别直接套。
page=0)| 屏幕位置 | ID | 名称 | X | Y | 宽×高 |
|---|---|---|---|---|---|
| ▶ 播放 | 49 | 啟動內掛丸 | 136 | 1 | 24×25 |
| □ 停止 | 50 | 停止內掛丸 | 161 | 1 | 24×25 |
| ⚙ 齿轮 | 51 | 設定內掛丸 | 186 | 1 | 24×25 |
| ✕ 关闭 | 52 | 關閉內掛丸 | 211 | 1 | 24×25 |
这四个 ID 是固定的、跨页不变的,名称由控件自己给出,零推测。
page=5,第 6 个标签)截图第 6 张。7 行纵向单选,行距 20,X 全为 15。
| 行 | 界面文字 | 勾选 ID | 坐标 (X,Y) | 「設定」按钮 ID | 按钮坐标 |
|---|---|---|---|---|---|
| 1 | 確認賣盒 | 47 | (15, 33) | — | — |
| 2 | 管理神獸 | 45 | (15, 53) | — | — |
| 3 | 管理聊天 | 55 | (15, 73) | 59 | (86, 70) |
| 4 | 商人之魂 | 90 | (15, 93) | 91 | (86, 90) |
| 5 | 刺客之魂 | 89 | (15, 113) | 113 | (86, 110) |
| 6 | 束縛之魂 | 155 | (15, 133) | 156 | (86, 130) |
| 7 | 戀人之魂 | 88 | (15, 153) | — | — |
| 右上 | 拾撿道具 | 57 | (120, 33) | — | — |
证据强度:45→「勾選後使用神獸時…」、55→「勾選後,會自動發出已設定…」、90→「啟動商人之魂。」、89→「啟動刺客之魂。」、88→「啟動戀人之魂。」、57→「勾選後,將自動撿取地上掉…」——6 个是提示原文直接命中;47/155 靠页号+行距定位。
同页其余控件:
| ID | 坐标 | 尺寸 | 推断 |
|---|---|---|---|
| 152 | (137, 49) | 0×0 | 隐藏占位 |
| 153 | (139, 158) | 13×13 | 右下圆形图像热区 |
| 154 | (139, 133) | 13×13 | 同上 |
| 53 | (54, 179) | 18×60 | 底部「儲存設定」 |
| 54 | (125, 179) | 18×60 | 底部「取消」 |
53/54 是 18×60 的竖条(比按钮大),实际是热区,不是按钮本体。
page=4,第 5 个标签)截图第 5 张。6 行,X 全为 16,Y 从 33 到 158、步长 25。
| 行 | 界面文字 | ID | 坐标 |
|---|---|---|---|
| 1 | 體力恢復道具 [11] 個以下 | 40 | (16, 33) |
| 2 | 內功恢復道具 [11] 個以下 | 41 | (16, 58) |
| 3 | 保管箱中沒有空格時 | 42 | (16, 83) |
| 4 | 有箭時(弓專用) | 43 | (16, 108) |
| 5 | 組隊被解散時 | 87 | (16, 133) |
| 6 | 回歸時結束遊戲 | 44 | (16, 158) |
证据强度:page=4 这一组只有这 6 个,X 全部 = 16,Y 严格 33/58/83/108/133/158,与截图 6 行完全同构,顺序不会错。
page=3,第 4 个标签)截图第 4 张。4 列 × 3 行,共 12 格,行优先编号。
| 列1 | 列2 | 列3 | 列4 | |
|---|---|---|---|---|
| 行1 | 28 | 29 | 30 | 31 |
| 行2 | 32 | 33 | 34 | 35 |
| 行3 | 36 | 37 | 38 | 39 |
坐标:X = 55 / 100 / 145 / 190,Y = 66 / 116 / 166,尺寸全 11×11。<br>名称统一是「輔助武功,或登錄所使用的…」,即 12 格子的悬浮提示。
每格下方的「組隊□」小勾在 page=0 组里(101~109 等),未逐个绑定。
page=2,第 3 个标签)截图第 3 张。两组「開 / 關」,2×2 布局。
| 界面 | ID | 坐标 | 状态 |
|---|---|---|---|
| 體力恢復設定 開 | 18 | (40, 51) | 实心 ⊙ |
| 體力恢復設定 關 | 19 | (123, 51) | 空心 ○ |
| 內功恢復設定 開 | 20 | (40, 144) | 实心 ⊙ |
| 內功恢復設定 關 | 21 | (123, 144) | 空心 ○ |
证据强度:page=2 组只有 4 个真实控件 + 3 个 ID=1 的脏数据,X 两列、Y 两行,与截图两组单选完全同构。<br>开在左、关在右,与截图一致。
滑块(體力恢復速度、內功恢復設定百分比)没有独立控件对象,是自绘的。
1,但控件落在 page=0 组)| 界面 | ID | 坐标 | 说明 |
|---|---|---|---|
| 13 行对话勾选 | 70 ~ 82 | X=28,Y=112 起每行 +20 | 共 13 个,与 orzo 填的 13 条对话一一对应 |
| 每秒重複對話 输入框 | 84 | (64, 391) | 对应 .aut 的 0x098(uint16,3~999) |
| 「選擇全部」勾选 | 83 | (187, 92) | 推断 |
| 底部「儲存設定」 | 85 | (76, 430) | 18×60 热区 |
| 底部「取消」 | 86 | (146, 430) | 18×60 热区 |
坐标顺序与界面顺序一致:70 是第 1 行(y=112),82 是第 13 行(y=352),不会错位。
0,只确定了结构)截图第 1、2 张。内容分两块:
确定的部分:
| 界面 | ID | 坐标 | 备注 |
|---|---|---|---|
| 格子热区(行1) | 11 / 12 | (98,33) / (153,33) | 提示「在墨魂之箱子中,為登錄的」 |
| 格子热区(行1下) | 159 / 160 | (105,44) / (163,44) | 无名称 |
| 格子热区(行2) | 13 / 14 | (98,56) / (153,56) | 提示「選擇是否要攻擊。」 |
| 3×3 小勾 | 101~109 | X=43/123/204,Y=81/101/121 | 网格规整 |
| 单格热区 | 110 | (194,57) | — |
这页没闭合:12 个格子 × 12 个热区,实际只找到 10 个候选,且无法确认哪个格子对应哪个 ID。<br>要闭合得靠点击实测(见第十一节)。
tools/rxjh_ctrl.lua)新增:
M.F_X, M.F_Y, M.F_W, M.F_H -- 0x028 / 0x02C / 0x030 / 0x034
ctrl.all() -- 每条现在带 x, y, w, h
ctrl.at(x, y) -- 按面板内坐标反查控件(容差 2px)
ctrl.nearest(x, y) -- 按最近中心点反查,返回控件 + 距离
用法(CE Lua 控制台):
local chunk = assert(loadfile([[C:\rxlib\rxjh_ctrl.lua]]))
chunk()
for _, c in ipairs(ctrl.all()) do
print(string.format("%s %d,%d %dx%d %s", tostring(c.id), c.x, c.y, c.w, c.h, tostring(c.name)))
end
tools/内挂控件清单_20261019.tsv —— 94 行,字段:<br>页号 / 页面 / ID / X / Y / 宽 / 高 / check / 组 / 对象地址 / 名称
+0x360 不是勾选状态实测:截图上「確認賣盒 / 管理聊天 / 拾撿道具」是实心,但 +0x360=1 的是 88(戀人) / 89(刺客) / 90(商人) / 91 / 113 / 155 / 156 —— 完全对不上。<br>所以 +0x360 不能用来判断用户在界面上勾了什么,也不能靠写它来改配置。
真正的开关存在 .aut 的 0x074 位图(35 字节)里,orzo 当前开着 [24,25,30,31,32,33,34]。
流程(我可以自动跑):
+0x360 和 .aut 0x074 的当前值这个办法能一次性把 35 位开关位 ↔ 6 个页面所有勾选框的映射全部拉出来。