"""只读诊断:为什么 _input_editor_looks_blank() 认不出空输入框。""" import os import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import numpy as np from PIL import Image, ImageDraw import wechat_bot as bot_module _HERE = os.path.dirname(os.path.abspath(__file__)) def main(): bot = bot_module.WeChatBot() bot.safe_window_mode = True bot.auto_activate_window = True if not bot.connect(activate=False, wait_if_missing=False): print("[-] 未挂载到企业微信窗口") return print(f"_ensure_visible(): {bot._ensure_visible()}") full = bot._capture_full_window() bot._refresh_message_geometry(full) full = bot._capture_full_window() scale = max(0.75, float(getattr(bot, "scale", 1.0) or 1.0)) height, width = full.shape[:2] print(f"窗口画面 : {width}x{height} scale={scale}") print(f"_composer_geometry_valid: {getattr(bot, '_composer_geometry_valid', None)}") print(f"_composer_rel_top : {getattr(bot, '_composer_rel_top', None)}") print(f"_editor_rel_top : {getattr(bot, '_editor_rel_top', None)}") print(f"输入框点击点(屏幕) : ({bot.input_x}, {bot.input_y})") print(f"输入框点击点(窗口内) : ({bot.input_x - bot.L}, {bot.input_y - bot.T})") x1 = max(0, int(bot._list_x + bot._list_w + 16 * scale)) x2 = min(width, width - int(160 * scale)) y1 = max(0, int(getattr(bot, "_composer_rel_top", height)) + int(42 * scale)) y2 = min(height, height - int(10 * scale)) print(f"编辑区采样框 : x {x1}~{x2} y {y1}~{y2} ({x2 - x1}x{y2 - y1})") body = full[y1:y2, x1:x2, :3].astype(np.int16) background = np.median(body.reshape(-1, body.shape[2]), axis=0) active = np.max(np.abs(body - background), axis=2) >= 18 active_columns = int(active.any(axis=0).sum()) limit = max(4, int(np.ceil(3.5 * scale))) print(f"背景中位色 : {background.tolist()}") print(f"活跃列数 : {active_columns} 阈值 <= {limit}") print(f"判定 : {'空' if active_columns <= limit else '非空(会被当成人工草稿/焦点不明)'}") print(f"_input_editor_looks_blank(): {bot._input_editor_looks_blank()}") cols = np.flatnonzero(active.any(axis=0)) if cols.size: print(f"活跃列窗口内 x 范围: {x1 + int(cols.min())} ~ {x1 + int(cols.max())}") rows = np.flatnonzero(active.any(axis=1)) print(f"活跃行窗口内 y 范围: {y1 + int(rows.min())} ~ {y1 + int(rows.max())}") crop = Image.fromarray(full[y1:y2, x1:x2, :3][:, :, ::-1]) crop.save(os.path.join(_HERE, "input_editor_crop.png")) marked = Image.fromarray(full[:, :, :3][:, :, ::-1]) draw = ImageDraw.Draw(marked) draw.rectangle([x1, y1, x2, y2], outline=(255, 0, 0), width=4) marked.save(os.path.join(_HERE, "input_editor_probe.png")) print("采样区裁剪图: tmp/input_editor_crop.png") print("整窗标注图 : tmp/input_editor_probe.png") if __name__ == "__main__": main()