.版本 2,缺这行易语言不认后面的 .子程序 / .参数。6 个常量,刷进易语言常量表。
.版本 2
.常量 IFManager基址, "25740828"
.常量 窗口可见标志, "64"
.常量 控件类型偏移, "8"
.常量 面板类型码, "24"
.常量 窗口子槽起点, "768"
.常量 窗口子槽个数, "192"
从对象虚表反查 RTTI 类名,日志里显示窗口名用。读不到返回空文本,不影响判定。
.版本 2
.子程序 读控件类名, 文本型
.参数 对象, 整数型
.局部变量 虚表, 整数型
.局部变量 定位器, 整数型
.局部变量 类型描述符, 整数型
.局部变量 名, 文本型
.局部变量 长度, 整数型
.如果真 (对象 ≤ 65536)
返回 (“”)
.如果真结束
虚表 = 内存_读整数型 (全局_进程句柄, 对象)
.如果真 (虚表 ≤ 65536)
返回 (“”)
.如果真结束
定位器 = 内存_读整数型 (全局_进程句柄, 虚表 - 4)
.如果真 (定位器 ≤ 65536)
返回 (“”)
.如果真结束
类型描述符 = 内存_读整数型 (全局_进程句柄, 定位器 + 12)
.如果真 (类型描述符 ≤ 65536)
返回 (“”)
.如果真结束
名 = 内存_读文本型 (全局_进程句柄, 类型描述符 + 12)
长度 = 取文本长度 (名)
.如果真 (长度 > 2)
.如果真 (取文本右边 (名, 2) = “@@”)
名 = 取文本左边 (名, 长度 - 2)
.如果真结束
.如果真结束
返回 (名)
主用。判定逻辑与原来一致,逐步写日志:IFManager 读数 → 槽对象+类名 → 每个面板(偏移/ID/大小/可见) → 结论。
.版本 2
.子程序 窗口是否弹出_日志, 逻辑型
.参数 槽偏移, 整数型
.局部变量 接口管理, 整数型
.局部变量 窗口对象, 整数型
.局部变量 子对象, 整数型
.局部变量 i, 整数型
.局部变量 面板偏移, 整数型
.局部变量 类型, 整数型
.局部变量 可见, 整数型
.局部变量 命中, 逻辑型
.局部变量 窗口名, 文本型
.局部变量 前缀, 文本型
.局部变量 行, 文本型
前缀 = 自定义时间 () + “[窗判] ”
接口管理 = 内存_读整数型 (全局_进程句柄, #IFManager基址)
.如果真 (接口管理 ≤ 65536)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 失败:IFManager 未读到(” + 到文本 (接口管理) + “)” + #换行符 + #换行符)
返回 (假)
.如果真结束
窗口对象 = 内存_读整数型 (全局_进程句柄, 接口管理 + 槽偏移)
.如果真 (窗口对象 ≤ 65536)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ (0x” + 取十六进制文本 (槽偏移) + “) 失败:该槽没有窗口对象” + #换行符 + #换行符)
返回 (假)
.如果真结束
窗口名 = 读控件类名 (窗口对象)
.如果真 (窗口名 = “”)
窗口名 = “(类名读取失败)”
.如果真结束
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ (0x” + 取十六进制文本 (槽偏移) + “) ” + 窗口名 + “ 对象 ” + 到文本 (窗口对象) + “ 开始扫描” + #换行符)
命中 = 假
.计次循环首 (#窗口子槽个数, i)
面板偏移 = #窗口子槽起点 + (i - 1) × 4
子对象 = 内存_读整数型 (全局_进程句柄, 窗口对象 + 面板偏移)
.如果真 (子对象 > 65536)
类型 = 内存_读整数型 (全局_进程句柄, 子对象 + #控件类型偏移)
.如果真 (类型 = #面板类型码)
可见 = 内存_读整数型 (全局_进程句柄, 子对象 + #窗口可见标志)
行 = 前缀 + “ 面板 +” + 到文本 (面板偏移) + “ 面板ID ” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 12)) + “ 大小 ” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 48)) + “x” + 到文本 (内存_读整数型 (全局_进程句柄, 子对象 + 52)) + “ 可见 ” + 到文本 (可见)
.如果真 (可见 = 1)
命中 = 真
行 = 行 + “ ★命中”
.如果真结束
挂机信息.加入文本 (行 + #换行符)
.如果真结束
.如果真结束
.计次循环尾 ()
.如果 (命中)
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 结论:弹出” + #换行符 + #换行符)
.否则
挂机信息.加入文本 (前缀 + “槽 ” + 到文本 (槽偏移) + “ 结论:未弹出” + #换行符 + #换行符)
.如果结束
返回 (命中)
挂机常开。恒 1 行输出:槽1236 InterExchange = 弹出。
.版本 2
.子程序 窗口是否弹出_简报, 逻辑型
.参数 槽偏移, 整数型
.局部变量 接口管理, 整数型
.局部变量 窗口对象, 整数型
.局部变量 子对象, 整数型
.局部变量 i, 整数型
.局部变量 类型, 整数型
.局部变量 可见, 整数型
.局部变量 命中, 逻辑型
.局部变量 窗口名, 文本型
接口管理 = 内存_读整数型 (全局_进程句柄, #IFManager基址)
.如果真 (接口管理 ≤ 65536)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ 读不到 IFManager” + #换行符)
返回 (假)
.如果真结束
窗口对象 = 内存_读整数型 (全局_进程句柄, 接口管理 + 槽偏移)
.如果真 (窗口对象 ≤ 65536)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ 无对象” + #换行符)
返回 (假)
.如果真结束
命中 = 假
.计次循环首 (#窗口子槽个数, i)
子对象 = 内存_读整数型 (全局_进程句柄, 窗口对象 + #窗口子槽起点 + (i - 1) × 4)
.如果真 (子对象 > 65536)
类型 = 内存_读整数型 (全局_进程句柄, 子对象 + #控件类型偏移)
.如果真 (类型 = #面板类型码)
可见 = 内存_读整数型 (全局_进程句柄, 子对象 + #窗口可见标志)
.如果真 (可见 = 1)
命中 = 真
跳出循环 ()
.如果真结束
.如果真结束
.如果真结束
.计次循环尾 ()
窗口名 = 读控件类名 (窗口对象)
挂机信息.加入文本 (自定义时间 () + “[窗判] 槽 ” + 到文本 (槽偏移) + “ ” + 窗口名 + “ = ” + 选择文本 (命中, “弹出”, “未弹出”) + #换行符)
返回 (命中)
日志版里写「弹出/未弹出」用的小工具。
.版本 2
.子程序 选择文本, 文本型
.参数 条件, 逻辑型
.参数 真值, 文本型
.参数 假值, 文本型
.如果 (条件)
返回 (真值)
.否则
返回 (假值)
.如果结束