.版本 2,缺这行易语言不认后面的 .子程序 / .参数。刷进易语言常量表。交易按钮 +0x38C/+0x394 = 908/916(申请页那组,另一阶段在 +0x37C/+0x388);组队按钮 +0x3B8/+0x3C0 = 952/960。控件ID 一律现读,别写死。
.版本 2
.常量 IFManager基址, "25740828"
.常量 窗口可见标志, "64"
.常量 控件类型偏移, "8"
.常量 面板类型码, "24"
.常量 窗口子槽起点, "768"
.常量 窗口子槽个数, "192"
.常量 交易窗口槽, "1236"
.常量 组队窗口槽, "1256"
.常量 交易按钮左偏移, "908"
.常量 交易按钮右偏移, "916"
.常量 组队按钮左偏移, "952"
.常量 组队按钮右偏移, "960"
从对象虚表反查 RTTI 类名,不落地任何窗口表,更新也不怕
.版本 2
.子程序 读控件类名, 文本型
.参数 对象, 整数型
.局部变量 虚表, 整数型
.局部变量 定位器, 整数型
.局部变量 类型描述符, 整数型
.局部变量 名, 文本型
.局部变量 长度, 整数型
.如果真 (对象 ≤ 65536)
返回 (“”)
.如果真结束
虚表 = 内存_读整数型 (全局_进程句柄, 对象)
.如果真 (虚表 ≤ 65536)
返回 (“”)
.如果真结束
定位器 = 内存_读整数型 (全局_进程句柄, 虚表 - 4)
.如果真 (定位器 ≤ 65536)
返回 (“”)
.如果真结束
类型描述符 = 内存_读整数型 (全局_进程句柄, 定位器 + 12)
.如果真 (类型描述符 ≤ 65536)
返回 (“”)
.如果真结束
名 = 内存_读文本型 (全局_进程句柄, 类型描述符 + 12)
长度 = 取文本长度 (名)
.如果真 (长度 > 2)
.如果真 (取文本右边 (名, 2) = “@@”)
名 = 取文本左边 (名, 长度 - 2)
.如果真结束
.如果真结束
返回 (名)
日志里写「弹出/未弹出」用的小工具
.版本 2
.子程序 选择文本, 文本型
.参数 条件, 逻辑型
.参数 真值, 文本型
.参数 假值, 文本型
.如果 (条件)
返回 (真值)
.否则
返回 (假值)
.如果结束
主用:逐步写日志(IFManager → 槽对象+类名 → 每个面板 → 结论)
.版本 2
.子程序 窗口是否弹出_日志, 逻辑型
.参数 槽偏移, 整数型
.局部变量 接口管理, 整数型
.局部变量 窗口对象, 整数型
.局部变量 子对象, 整数型
.局部变量 i, 整数型
.局部变量 面板偏移, 整数型
.局部变量 类型, 整数型
.局部变量 可见, 整数型
.局部变量 命中, 逻辑型
.局部变量 窗口名, 文本型
.局部变量 前缀, 文本型
.局部变量 行, 文本型
前缀 = 自定义时间 () + “[窗判] ”
接口管理 = 内存_读整数型 (全局_进程句柄, #IFManager基址)
.如果真 (接口管理 ≤ 65536)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 失败:IFManager 未读到(” + 到文本 (接口管理) + “)” + #换行符 + #换行符)
返回 (假)
.如果真结束
窗口对象 = 内存_读整数型 (全局_进程句柄, 接口管理 + 槽偏移)
.如果真 (窗口对象 ≤ 65536)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ (0x” + 取十六进制文本 (槽偏移) + “) 失败:该槽没有窗口对象” + #换行符 + #换行符)
返回 (假)
.如果真结束
窗口名 = 读控件类名 (窗口对象)
.如果真 (窗口名 = “”)
窗口名 = “(类名读取失败)”
.如果真结束
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ (0x” + 取十六进制文本 (槽偏移) + “) ” + 窗口名 + “ 对象 ” + 到文本 (窗口对象) + “ 开始扫描” + #换行符)
命中 = 假
.计次循环首 (#窗口子槽个数, i)
面板偏移 = #窗口子槽起点 + (i - 1) × 4
子对象 = 内存_读整数型 (全局_进程句柄, 窗口对象 + 面板偏移)
.如果真 (子对象 > 65536)
类型 = 内存_读整数型 (全局_进程句柄, 子对象 + #控件类型偏移)
.如果真 (类型 = #面板类型码)
可见 = 内存_读整数型 (全局_进程句柄, 子对象 + #窗口可见标志)
行 = 前缀 + “ 面板 +” + 到文本 (面板偏移) + “ 面板ID ” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 12)) + “ 大小 ” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 48)) + “x” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 52)) + “ 可见 ” + 到文本 (可见)
.如果真 (可见 = 1)
命中 = 真
行 = 行 + “ ★命中”
.如果真结束
挂机信息.加入文本 (行 + #换行符)
.如果真结束
.如果真结束
.计次循环尾 ()
.如果 (命中)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 结论:弹出” + #换行符 + #换行符)
.否则
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 结论:未弹出” + #换行符 + #换行符)
.如果结束
返回 (命中)
挂机常开:恒 1 行输出
.版本 2
.子程序 窗口是否弹出_简报, 逻辑型
.参数 槽偏移, 整数型
.局部变量 接口管理, 整数型
.局部变量 窗口对象, 整数型
.局部变量 子对象, 整数型
.局部变量 i, 整数型
.局部变量 类型, 整数型
.局部变量 可见, 整数型
.局部变量 命中, 逻辑型
.局部变量 窗口名, 文本型
接口管理 = 内存_读整数型 (全局_进程句柄, #IFManager基址)
.如果真 (接口管理 ≤ 65536)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ 读不到 IFManager” + #换行符)
返回 (假)
.如果真结束
窗口对象 = 内存_读整数型 (全局_进程句柄, 接口管理 + 槽偏移)
.如果真 (窗口对象 ≤ 65536)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ 无对象” + #换行符)
返回 (假)
.如果真结束
命中 = 假
.计次循环首 (#窗口子槽个数, i)
子对象 = 内存_读整数型 (全局_进程句柄, 窗口对象 + #窗口子槽起点 + (i - 1) × 4)
.如果真 (子对象 > 65536)
类型 = 内存_读整数型 (全局_进程句柄, 子对象 + #控件类型偏移)
.如果真 (类型 = #面板类型码)
可见 = 内存_读整数型 (全局_进程句柄, 子对象 + #窗口可见标志)
.如果真 (可见 = 1)
命中 = 真
跳出循环 ()
.如果真结束
.如果真结束
.如果真结束
.计次循环尾 ()
窗口名 = 读控件类名 (窗口对象)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ ” + 窗口名 + “ = ” + 选择文本 (命中, “弹出”, “未弹出”) + #换行符)
返回 (命中)
一次回答「现在弹着什么」,返回多行窗口名
.版本 2
.子程序 当前弹出窗口, 文本型
.局部变量 接口管理, 整数型
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 窗口对象, 整数型
.局部变量 子对象, 整数型
.局部变量 窗口名, 文本型
.局部变量 结果, 文本型
接口管理 = 内存_读整数型 (全局_进程句柄, #IFManager基址)
.如果真 (接口管理 ≤ 65536)
返回 (“”)
.如果真结束
.计次循环首 (#窗口子槽个数, i)
窗口对象 = 内存_读整数型 (全局_进程句柄, 接口管理 + #窗口子槽起点 + (i - 1) × 4)
.如果真 (窗口对象 > 65536)
窗口名 = 读控件类名 (窗口对象)
.计次循环首 (#窗口子槽个数, j)
子对象 = 内存_读整数型 (全局_进程句柄, 窗口对象 + #窗口子槽起点 + (j - 1) × 4)
.如果真 (子对象 > 65536)
.如果真 (内存_读整数型 (全局_进程句柄, 子对象 + #控件类型偏移) = #面板类型码)
.如果真 (内存_读整数型 (全局_进程句柄, 子对象 + #窗口可见标志) = 1)
结果 = 结果 + 窗口名 + “ 槽” + 到文本 (#窗口子槽起点 + (i - 1) × 4) + “ 面板+” + 到文本 (#窗口子槽起点 + (j - 1) × 4) + #换行符
跳出循环 ()
.如果真结束
.如果真结束
.如果真结束
.计次循环尾 ()
.如果真结束
.计次循环尾 ()
返回 (结果)
差分:只返回这次新出现的窗口
.版本 2
.全局变量 全局_上次可见窗口, 文本型
.版本 2
.子程序 监视窗口弹出, 文本型
.局部变量 当前, 文本型
.局部变量 行数组, 文本型, , "0"
.局部变量 k, 整数型
.局部变量 新弹出, 文本型
当前 = 当前弹出窗口 ()
新弹出 = “”
行数组 = 分割文本 (当前, #换行符, )
.计次循环首 (取数组成员数 (行数组), k)
.如果真 (行数组 [k] ≠ “”)
.如果真 (寻找文本 (全局_上次可见窗口, 行数组 [k], , 假) = -1)
新弹出 = 新弹出 + 行数组 [k] + #换行符
.如果真结束
.如果真结束
.计次循环尾 ()
全局_上次可见窗口 = 当前
返回 (新弹出)
点击 = 派发事件 0x409 + 控件ID
' —— 点击控件(远程执行,需你的执行器;CE 自己点不了,XIGNCODE 拦 createthread)
' 机器码:6A00 68<控件ID> 6809040000 8B0D0CC68801 8B11 8B0D0CC68801 8B4204 FFD0 C3
' 含义:push 0 / push 控件ID / push 0x409 / 取 [0x0188C60C] 的 vcall[1](控件ID, 0x409)
' 控件ID 必须现读:控件ID = 内存_读整数型(句柄, 按钮对象 + 12)