Files
isphere-ai-bridge/docs/source-discovery/2026-07-11-a-route-user-silent-rpa.md
2026-07-11 20:04:34 +08:00

5.4 KiB
Raw Blame History

A-route RPA 用户无感运行说明

日期2026-07-11

目标

A-route 当前看重窗口和 UIA 控件,而不是背后的网络逻辑。这里的“用户无感”指:

  1. 不遮挡当前用户桌面。
  2. 不抢焦点。
  3. 不接管鼠标键盘。
  4. 数字员工仍然能通过 HWND/UIA 找到目标窗口和控件。
  5. 所有动作可记录、可复现、可回收。

当前已实现

脚本:

powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -UserSilent

效果:

  • 从完整离线客户端目录启动 IMPlatformClient.exe
  • 使用 -WindowStyle Minimized 降低启动阶段闪窗概率。
  • 找到真实 IMPlatformClient 窗口后移动到屏幕外:
    • 主窗:x=-32000, y=-32000
    • 提示窗:同样移到屏幕外
  • 设置 SWP_NOACTIVATE,不调用前台激活。
  • 不生成屏幕截图,避免因为窗口在屏幕外得到无意义图片。
  • 继续输出 UIA dump供 RPA 选择器验证。

抗干扰能力

新增守护模式:

powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -WindowMode Visible -WatchSeconds 30 -PollIntervalMs 500

也可和无感模式一起使用:

powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -UserSilent -WatchSeconds 30 -PollIntervalMs 500

当前守护逻辑:

  • 用户手动移动主窗口:检测到位置/大小偏离后自动移回目标位置。
  • 用户手动移动提示窗:检测到位置/大小偏离后自动移回目标位置。
  • 用户关闭主窗口/杀掉客户端进程:检测到主窗口消失后自动重新启动离线客户端。
  • 每次守护输出:
    • watch_iteration_count
    • repair_count
    • relaunch_count
    • recovery_actions

本轮实际验证:

  1. 模拟移动窗口到 760,260,310x610

    • 守护输出 repair_count=1
    • recovery_actions=["repair_window_placement"]
    • 最终窗口恢复到 120,120,270x570
  2. 模拟关闭客户端进程:

    • 被关闭 PID11592
    • 守护输出 relaunch_count=1
    • 新启动 PID10504
    • recovery_actions=["relaunch_missing_main_window","repair_after_relaunch"]
    • 最终 UIA 根控件仍为 frmLogin

抗干扰强度结论:

  • 对“用户移动窗口”:强。
  • 对“用户关闭窗口/进程”:中强,可自动重启。
  • 对“用户在关键发送瞬间抢焦点/操作同一窗口”:当前还不是强,需要动作级锁定和发送前后校验。
  • 对“应用崩溃/服务端不可用”:只能自动拉起窗口;业务登录/聊天能力仍受真实服务端影响。

本轮验证结果:

  • 新启动进程:IMPlatformClient.exe
  • PID20060
  • 主窗口:0x340330
  • UIA 根控件:
    • automation_id=frmLogin
    • framework_id=WinForm
    • class_name=WindowsForms10.Window.8.app.0.d3a00f_r7_ad1
  • UIA dump 仍可读,即使窗口处于屏幕外:
    • is_offscreen=true
    • 子控件 skinStateskinLoadPanel 可见于控件树

推荐无感等级

L1当前用户会话内屏幕外运行

适合当前开发机验证:

powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -UserSilent

优点:

  • 实现最快。
  • 不影响当前屏幕。
  • UIA 读控件可继续工作。

限制:

  • 如果某些发送动作必须依赖真实鼠标点击或 OCR 截图,屏幕外模式不适合。
  • 发送路径应优先使用 ValuePatternInvokePatternWM_SETTEXTBM_CLICK 等 HWND/UIA/Win32 方式。

L2当前用户会话内可见但不激活

适合排查窗口状态:

powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -WindowMode Visible -NoActivate

优点:

  • 人能看到窗口。
  • 尽量不抢焦点。

限制:

  • 仍可能遮挡用户桌面。
  • 只适合调试,不适合长期运行。

L3独立 Windows 用户会话运行

这是生产上更稳的“真正无感”方案:

  • 给数字员工单独建一个 Windows 用户。
  • 在该用户会话里登录 iSphere。
  • RPA/WinHelper/MCP 都运行在同一个独立会话。
  • 业务用户使用自己的桌面,看不到数字员工窗口。

优点:

  • 不影响业务用户桌面。
  • 不抢业务用户焦点。
  • 可以保留真实可见窗口,兼容 OCR/坐标兜底。

限制:

  • 需要部署层面的账户和会话管理。
  • WinHelper 必须和目标窗口在同一交互式桌面会话里运行。

L4不用 RPA走 B-route/API/sidecar

这是最终最无感的方向:

  • 没窗口。
  • 不依赖桌面。
  • 不受焦点、分辨率、UI 改版影响。

但当前分支是 A-route RPA所以本轮先把 L1/L2 做出来。

结论

当前已经具备 L1 无感基础能力:

  • 真实客户端可打开。
  • 可屏幕外运行。
  • 不需要前台焦点。
  • UIA 控件树仍可读取。

下一轮应把发送/搜索动作约束在非焦点方式上:

  1. 优先 UIA ValuePattern/InvokePattern
  2. 其次 HWND 消息 WM_SETTEXT/BM_CLICK
  3. 最后才考虑坐标/OCR坐标/OCR 只能放到独立 Windows 用户会话里做,不能放当前用户桌面长期运行。