怎么拿消息
抓句柄画面 → VL / OCR 读;PostMessage 投点击
Windows 客户端 · 竞品技术调研 · v1.5.0 口径
这三问不是三条技术路线,是同一套 Windows GUI 方案的三个切面:PrintWindow 不抢前台抓画面(在跑)+ 意图队列代发 + 礼让闸——你们销售客户端已落地的那套;其中「PostMessage 无感切会话」尚在验证。曾经能替代它的 Hook / 协议两族,2026 年已被腾讯逐族封死。
结论先行
约束从来不是「能不能跑」,是能不能不打扰销售本人。做到这点靠的不是更准的坐标,而是分开处理读和发:PrintWindow 打在句柄上抓画面(被别的程序完全盖住也照抓,像素差 0.0,不抢前台,已实测);发送走意图队列 + 礼让闸(只在销售离手的空档代发);「PostMessage 无感切会话」尚在验证。四个技术族里只有官方接口零封号但覆盖不到代回;Hook / 协议两族能力最全但已整族死亡。你们的 GUI 视觉方案是现存唯一「既能代回、封号面又最低」的路。市面竞品各走一派——极域云做到「最小化 + 不影响电脑其他操作 + 1~2 秒」,但它官方 PPT 自证是靠 Hook 注入换来的、非纯 GUI,落在高封号族;水流我们逐帧实测反而是占机的(红条「请暂停操作键盘鼠标」);工作手机派(亿量 / 亿销云)干脆不在电脑上碰微信。「最小化 + 不打扰」在市场上是被当卖点公开讲的——所以这不是能不能做,是你们要不要把它从「别人的口头卖点」做成「自己实测坐实的能力」。
01 三问逐解
三问共享同一条链路:PrintWindow 抓图 → VL/OCR 读 → LLM 生成 → PostMessage / SendInput 发。差别只在每一问吃这条链路的哪一段。
一句话
PrintWindow 打在窗口句柄上抓画面 + PostMessage 把点击投进消息队列,两者都不需要窗口在前台。真正「最小化」用隐藏桌面,而不是系统最小化。
PrintWindow(hwnd, hdc, PW_RENDERFULLCONTENT) 直接对句柄取像素——窗口被 Edge 全屏遮挡也照抓,像素差 0.0(vision.py 实测)。它不依赖窗口可见,是「看得见被盖住的微信」的根。
PostMessageW 把 WM_LBUTTONDOWN/UP 投进目标窗口的消息队列,不激活、不聚焦,最小化 / 被盖住也能投递。坐标按客户区归一化,窗口挪动 / 缩放自动重标定。
坑:系统真最小化会让部分窗口停止渲染,PrintWindow 拿到空白。稳妥做法是把微信丢进独立 Windows 桌面(CreateDesktop)或移到屏幕外——对用户「看着」像收起来了,实际全程可抓可点。v1.5.0 有此模式但默认关、探针未跑。
为什么不能用安卓那套 SendInput:SendInput 注入的是系统级全局输入流,必须把窗口顶到前台,最小化必然失效——这是架构差异。Windows 侧正因为改用了句柄定向的 PrintWindow / PostMessage,才绕过了这个死结。
一句话(据真实 spec 校准)
分两半:「读 / 采集」不抢前台(PrintWindow,实测确认);「发 / 代发」要抢前台,靠礼让闸(销售空闲才发、忙则排队)避免打断。真正「无感切会话」还是 P0 待验证。
默认 20 秒一轮,PrintWindow 读那个窗口自己的画面,与「谁在前台」无关——监控 / 读消息全程对销售零干扰。坐标读 DPI + client rect 后全按相对坐标算,不写死像素。
代发要抢前台(填入 + 回车 + 回读)。执行前判 GetLastInputInfo 空闲时长 + 当前前台是不是目标微信;销售正在别处打字 → 意图排队等待(超时默认 5 分钟)。所以不是「零占用」,是「只在销售离手的空档发」。
「PostMessage 能否不激活窗口点动会话列表」是 P0 探针要验的开放问题,决定能不能做到「销售无感切会话」——目前未坐实。切会话属「动界面」,与代发同一道礼让闸;拿到真机数据前,别把它当已实现能力对外讲。
artifact 实测:三个活跃 UIA 项目里 ValuePattern 与 invoke() 全是 0 次、100% 靠真鼠标真键盘;pywechat 的 maximize 出现 740 次,默认就是把微信最大化。「不抢鼠标」在开源那边是付费墙后的特性,在你们这是默认。
竞品正好卡在这一格(详见 §06):极域云做到「最小化 + 不影响电脑其他操作」,但靠的是 Hook 注入(非纯 GUI、高封号);水流实测反而弹红条「请暂停操作键盘鼠标」直接占机;鲲炬官方微信可见 + 界面隐形操作,机理同路但「抢不抢焦点未验证」。没有一家被实测坐实过代发时真不抢焦点——你们的「PostMessage 无感切会话」也还在 P0 待验证,谁先实测坐实谁赢这格。
一句话(据真实 spec 校准)
先分清是哪种「回复」:当前设计是人在环的一键代发——销售点一下、我们几秒内起草好并代发,「10 秒」是这段生成 + 代发的预算。不是全自动 auto-reply。
PrintWindow 是本地 GDI 调用、便宜,可高频截帧检测红点 / 新气泡;有新消息才升频、才触发 VL。避开「每帧都发云模型」的慢。
LLM 几秒级(快模型 + 流式)。销售点发送后,几秒把建议话术生成好。
发送走意图队列:点发送 → 写 sw_send_intents → sidecar 轮询领单执行 → 回读。点完到发出多 1–3 秒轮询延迟(换来每条可审计 + 手机点发也能让电脑执行)。这是「10 秒」里必须算进去的一段。
所以严格讲,「10 秒内回复」= 销售点一下 → 生成(几秒)+ 意图队列(1–3s)+ 代发回读,人在环、可控可审计。竞品口径:极域云及其他家对接时都自述「1~2 秒内回复」(含全自动、厂商自述),所以「10 秒」在市场上被认为绰绰有余——你们人在环的口径反而更稳。若要全自动 auto-reply(无人点),那是另一档:封号面更高,亿量已因此放弃(见 §06),需单独评估。
02 技术全景
这些名字不在同一层,混着比会得出没意义的结论。先分清它从哪里读、往哪里写。基准(你们 v1.5.0)单列在最上,四族是被评估的替代路。
怎么拿消息
抓句柄画面 → VL / OCR 读;PostMessage 投点击
最小化可控
读:被盖住 / 桌面下方照抓 ✅;真最小化抓不到、切会话点动待验证 ⚠️
抢焦点
读:否 ✅ / 发:抢前台 + 礼让闸
回复时延
秒级,进 10s
版本脆弱
低——不依赖偏移 / 控件名,坐标按窗口归一化
封号风险
最低 不注入不改内存(惟 SendInput 有裂缝,见 §05)
现状
你们 v1.5.0 在跑;市面同构 Open-AutoGLM(26k star)、竞品水流 / 子准 RPA 同族
怎么拿消息
问 Windows 要控件树,读结构化文本
最小化可控
⚠️ 需窗口已渲染;且微信 4.x 冷启动树是空壳(见 §04)
抢焦点
pywechat 默认 maximize 会抢;控件调用本可不抢,活跃项目基本没用
回复时延
低(1–3s)
版本脆弱
中——4.x 起 UI 树按需暴露,多数旧库失效
封号风险
中低 非注入,但仍被 2026-01-29 公告口径覆盖
现状
cluic/wxauto 已死、wxauto4 已清空、wxautox4 锁 4.0.5 付费、pywechat 活跃但许可证 NOASSERTION、wechatauto-replica 靠 WriteProcessMemory 已越线
怎么拿消息
注入 DLL,直接调微信内部收发函数
最小化可控
✅ 完全后台 / 可隐藏(不碰 UI)
抢焦点
否
回复时延
<1s(进程内回调,最快)
版本脆弱
极高——偏移量锁死某一构建号
封号风险
高 风控主动检测注入
现状
开源整族已死:WeChatFerry 已 archived、作者本人号被封自述「搞不动了」;wxhelper 停在 3.9;WeChat-Hook 无许可证=脱壳外挂。4.x 无任何可用开源 hook。但商用闭源 hook 仍在跑——竞品极域云「移动端 Hook + PC 执行引擎」就是活体案例(§06),拿封号风险换后台 / 不打扰能力。
怎么拿消息
假装 iPad / 网页版直连服务器,零本地设备
最小化可控
N/A(不需要客户端)
抢焦点
否
回复时延
最低(服务端推)
版本脆弱
高——协议变即失效
封号风险
极高 风控画像最差
现状
整族已死:网页版 2019 关;Gewechat 因「法律原因」2025-04-30 下线;WeChatPadPro 自带风险表标「4 级=永久封锁」,仓内多起登录即封。
怎么拿消息
腾讯自己开的口子
最小化可控
N/A(服务端)
抢焦点
否
回复时延
低
版本脆弱
无
封号风险
零 唯一合规
现状 · 但覆盖不到代回
iLink 仅「机主与自己 bot」私聊、不能代回好友消息、不能主动推送;企微 kf 只客服会话 / 群发、不覆盖好友单聊。口子开在哪由腾讯定。
族 ①②在销售的电脑上跑,族 ③不需要设备,族 ④不需要客户端。三种形态的封号面与合规面完全不同,不能放一张表里直接排名——所以本页把基准单列、四族并列,而不是硬凑一个总分。
03 为什么只剩这条路
每一条都不是技术失效,是平台侧主动关门。看清这条线,才知道现在为什么只剩 GUI 视觉和官方接口两条活路。
2019 关协议、2025 关数据、2026-01 关模拟按键。三次关门方向一致:把第三方从个人号的消息通道里清出去,只留官方入口。头部框架 CowAgent(46674★)、LangBot(17554★)2026 年都把非官方通道整个删了、只留官方 iLink——这不是观点,是两次用脚投票。
04 一个运行时字节
社区流传「老号有树、新号没树」。真正的机制被一个仓(wechatauto-replica)写进了注释——它和 UIA 族能不能用直接相关,也解释了旧 wxauto 为什么在 4.x 上失效。
# 微信内置 Qt accessibility gate:QAccessible 查询前会检查一个运行时 active # byte。冷启动未启用读屏时该 byte 为 0,WM_GETOBJECT 只能拿到 Qt 外壳; # 热写为 1 后当前进程立即返回 mmui provider,无需重启微信。 QACCESSIBLE_ACTIVE_RVA_BY_VERSION = {"4.1.11.22": 0x0A1E7DB8} QACCESSIBLE_CORE_STRING = b"qt.accessibility.core"
冷启动
UIA 只看到 Qt51514QWindowIcon 两个子节点。这就是旧 wxauto 在 4.x 失效的根因。
写 1 之后
变成 mmui::MainWindow,chat_input_field 可定位,它的 Name 就是聊天对象。
代价
靠 WriteProcessMemory 写进微信进程。不注代码、不 hook 函数,但已不是纯 GUI。
不管走哪条路,都有一个 20 行的免费体检:窗口类名是 mmui::* 就有树,是 Qt51514QWindowIcon 就没有。这段值得抄进部署前自检,哪怕你们不走 UIA——它一句话回答「这台销售机有没有结构化读的可能」。
05 合规与封号
长尾厂商的标准话术是「100% 模拟人工,非 HOOK 非协议,所以不是外挂」。这话在技术封号面上大致成立(纯 GUI 是最低档),但在条款 / 政策面上不成立——两张网射程不同,别混为一谈。
给决策的一句话:这个场景 2026 年不存在低风险方案。要上,只能按「已知违规、低价值号试点、准备好业务预案」来做,不能按「我们找到了一个安全方案」来汇报。
纯 GUI 是四族里封号面最低的一档,但「最低」不等于「零」——低价值试点号 + 白名单 + 限速 + fail-closed 是硬配套。
06 竞品实证
据 upio.ai/akke 竞品页 + 竞品调研 / 深度对接文件夹 + 官方 PPT + 演示视频。关键:确实有竞品(极域云)做到「最小化 + 不影响电脑其他操作」——但它官方 PPT 自证是靠 Hook 注入换来的,落在高封号族、不是纯 GUI。水流则是硬件 RPA 占机。同一句「不打扰」,机理和封号面天差地别,别只看结论。
三源核过:①对接原话「电脑运行时最小化、不影响电脑端其他操作」+「1~2 秒回复」;②官方 PPT 自证机制——「移动端 Hook + PC 端执行引擎」「微信 / 企微深度通信接入采用 Hook + WSS 私有连接」;③演示视频是自研 SaaS 控制台(算力点计费、好友任务 / 聚合聊天 / 招呼语 / 间隔配置),没有水流那种占机红条。
关键更正:极域的「不打扰」不是纯 GUI 做到的,是靠 Hook(注入)——进程内驱动本来就不碰前台。所以它和水流并不矛盾(一个 Hook 后台、一个硬件 RPA 占机,不同族不同表现)。代价是极域落在高封号的 Hook 族(见 §02 / §05)——它拿封号风险换了不打扰。你们选纯 GUI 避封号,就不能照抄它走 Hook;「不打扰」得靠隐藏桌面 / 句柄级自己坐实。(唯一没逐帧抓到的是「最小化那一刻代发」的画面,故这条标「机制可信、未逐帧坐实」。)
两层:自研桌面控制台 + 执行器驱动原样的官方微信客户端(任务栏里独立进程、未改),AI 在界面上「隐形」操作——机理与你们 GUI 视觉方案同族。提示词 3 万字暴露、日限 10–50/人。但 upio 页标注:是否真后台、执行时抢不抢焦点「未验证」——和你们 v1.5.0 的「PostMessage 无感切会话」一样,都还在待验证那格。
自研微信聚合壳把多个号包进去(用户只看聚合 UI)。软件 + 硬件双模 RPA;硬件模式顶部常驻红字「模拟操作中,请暂停操作键盘鼠标」+「Ctrl+Alt+Del 解除锁定」——跑起来那台电脑人不能用。这是我们唯一逐帧实测的一家,也是「不打扰」的反面:它靠藏壳绕过,没解决占机。
用定制 ROM 的安卓工作手机采集,桌面只是分析 / 起草层——天然不影响电脑(微信压根不在电脑上)。亿量更保守:桌面只分析、完全不做自动回复。这也是一种「不打扰」的答案:把微信挪出这台电脑。
亿量原话:「原来我们也考虑过开发这一块,但很容易会导致这个封号」——连竞品都判定「桌面自动代发」太容易封号而主动放弃。整片看下来:极域用 Hook 换到了不打扰、但把号押上封号面;水流靠占机绕过;亿量干脆不做。「不打扰」+「低封号」两个同时要,市面上没有一家做到——这正是你们纯 GUI 路要坐实的空位。
同样是「代客回复个人微信」,两条路的取舍在下表。不是谁绝对好,是你们把「号的安全 + 可审计」排在「极致不打扰」前面——这决定了不该照抄极域。
| 维度 | 极域 · Hook 路Hook + WSS 注入 | 你们 · 纯 GUI 路PrintWindow + 意图队列 |
|---|---|---|
| 不打扰 · 读 | ✅ 进程内,天然后台 | ✅ PrintWindow 不抢前台(实测) |
| 不打扰 · 发/切会话 | ✅ 进程内直接调,天然不抢 | ⚠️ 发抢前台 + 礼让闸;无感切会话 P0 待验证 |
| 最小化真后台 | ✅ 不依赖窗口 | ⚠️ 真最小化抓不到,需隐藏桌面 / 恢复 |
| 回复时延 | <1s(进程内回调) | 秒级(生成 + 意图队列 1–3s),进 10s |
| 封号面 | 🔴 高——风控主动测注入 DLL | 🟢 最低——不注入不改内存(惟 SendInput 一条裂缝) |
| 合规射程 | 双网都够得着:DMCA/§1201 + 治理公告 | 只在治理公告 / 规范射程,不在 DMCA/§1201 |
| 版本脆弱 | 极高——偏移锁死构建号,微信每更一版可能失效 | 低——不依赖偏移 / 控件名,坐标相对化 + 校准 |
| 工程 / 维护 | 逆向追版,需专人常态维护 | 相对坐标校准 + 意图队列,复用视频 runner 同构 |
| 可审计 / 可控 | 弱——进程内动作,难留证据链 | 强——每条代发一行 sw_send_intents + 回读 |
| 掉链子后果 | 号被封(wcferry 作者本人号即被封) | 发不出 / 漏发(fail-closed),不封号 |
| 一句话 | 拿封号风险换极致不打扰 + 速度 | 拿「发时短暂抢前台 + 切会话待验证」换零注入 / 可审计 / 低封号 |
最看重「销售完全无感 + 最快」→ 极域 Hook 路更强,但把号押上去、且随微信升级常态返工。最看重「号活着 + 可审计 + 能对甲方交代」→ 你们纯 GUI 路是对的,缺的两格(真后台 / 无感切会话)用隐藏桌面 + §07 那条 P0 实测补上,而不是掉头去走 Hook。
07 可执行技术方案
不是「换个库」,是把已定架构落全、把两个未知变成已知、再把合规护栏钉上。方案 A = 你们已定的真实架构(store-workbench spec),B 是半天探针,C 必须随代码走。
采集循环(读,不抢前台)
PrintWindow(PW_RENDERFULLCONTENT) 默认 20 秒一轮抓句柄画面 → VL / OCR 读;读 DPI + client rect,会话列表区 / 聊天区 / 输入框 / 发送控件位置全按相对坐标算。真最小化抓不到(实测)→ 装机校准,校准失败拒绝执行。
验收:DPI 100/125/150/200% × 微信 3.x/4.x × 企微,每格校准 + dry-run 过意图队列发送(人在环,1–3s 轮询)
销售网页点发送 → 写一行 sw_send_intents → sidecar GET /api/agent/intents?claim=1 认领(只回本设备 / 本成员、带乐观锁 + 心跳、看门狗翻超时)→ 执行 → 回报。per-device 凭据(销售机几十台在别人手里、会离职),不用全机队共享 key。
验收:意图状态机单测(合法迁移 / 幂等回报 / 10 分钟去重)+ 鉴权 fail-closed(缺凭据 503 而非放行)三道闸(每条代发必过)
①认人门:切到目标会话后独立比对「当前聊天窗对方 = 意图里的人」(读聊天窗标题 + 备注名),有自己的测试。②礼让闸:GetLastInputInfo 空闲 + 前台是目标微信才发,销售在忙则排队、超时 5 分钟。③回读:气泡出现右侧 + 输入框已清空 + 最新文本与意图近似。
验收:每台机 20 轮 dry-run 零错人 + 5 轮人工旁观真发⚠️ P0 待验证 · PostMessage 无感切会话
「PostMessage 能否在不激活窗口的情况下点动会话列表」是决定 P3「销售无感切会话」能否成立的开放问题——目前未坐实。拿到数据前,切会话按「动界面」走礼让闸(会短暂抢前台),别写成「已实现无感」。
验收:≥3 台机采样 + PostMessage 点会话列表的 flag 判定20 行体检
读窗口类名:mmui::* → 有结构化树可走 UIA;Qt51514QWindowIcon → 只有空壳、只能视觉。多台销售机 × 多号跑一遍出命中率。
验收:拿到「这批机 mmui 命中率 X%」的确定数字只读那个 gate,不写
确认 QACCESSIBLE active byte 机制存在即可(RVA 按版本 {"4.1.11.22":0x0A1E7DB8})。体检阶段只读不写——一旦 WriteProcessMemory 写它就越过「纯 GUI」红线(见 §05)。
验收:结论落 memory,从企微扩到个人微信 Windows 端补掉 SendInput 裂缝
回车改 PostMessage(WM_KEYDOWN VK_RETURN) 或「视觉点发送键」,去掉 LLMHF_INJECTED 注入标志。做对照实测(发得出去 vs 有没有注入标志)。
验收:一条消息发出、且低级钩子读不到注入标志灰度四档,任一档掉指标退回上一档
SHADOW(影子生成不发)→ ALLOWLIST(白名单单联系人 / 文件传输助手)→ CONCURRENT(双联系人并发)→ FULL。每档观察:问价准确率 / 直接回答率 / 生成 P95 / STOP 原因 / 人工改写率。
验收:专用小号养 1–2 周;大号只许登录只读业务预案
低价值试点号 + 限速 + fail-closed(不确定即停、发后核不到气泡即拉总闸交人工)。按「已知违规」汇报,不按「已找到安全方案」汇报。
验收:封号预案 + 回退路径成文,决策层签字后再放量08 附 · 安卓侧对照
本页三问是 Windows 侧。另一份 artifact 是安卓个人微信 AI 代回——同一个后端契约(ping/generate/confirm)的另一条产线,补的是「销售身边不用有一台电脑」这一格。
Mac 上 Python + ADB 拴一台真机:每秒 adb 截图 → 云 Qwen2.5-VL 读(置信 ≥0.92)→ AdbKeyboard 灌字 → adb input tap(坐标由 dp 几何模型推导)。不注册无障碍、只点击不读树,对微信可见性压到最低。
装进手机的原生 Kotlin APK:NotificationListenerService 触发 → MediaProjection 截屏 + 端上 MLKit 中文 OCR(免 GMS)→ 自建 InputMethodService.commitText 打字 → 无障碍 dispatchGesture 点击。代价:把「对微信不可见」换成了「可见」,换来「不需要电脑」。
个人微信 8.0.76 真机 uiautomator dump:会话列表页与聊天页各 1 个节点、0 个带文本节点——控件树被整棵屏蔽,activity 名伪装成 LauncherUI。所以安卓两边也只能「看屏幕」,和 Windows 同理,区别只是看屏幕的那台机器是电脑还是手机。