# A-route RPA 用户无感运行说明 日期:2026-07-11 ## 目标 A-route 当前看重窗口和 UIA 控件,而不是背后的网络逻辑。这里的“用户无感”指: 1. 不遮挡当前用户桌面。 2. 不抢焦点。 3. 不接管鼠标键盘。 4. 数字员工仍然能通过 HWND/UIA 找到目标窗口和控件。 5. 所有动作可记录、可复现、可回收。 ## 当前已实现 脚本: ```powershell 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 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 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. 模拟关闭客户端进程: - 被关闭 PID:`11592` - 守护输出 `relaunch_count=1` - 新启动 PID:`10504` - `recovery_actions=["relaunch_missing_main_window","repair_after_relaunch"]` - 最终 UIA 根控件仍为 `frmLogin` 抗干扰强度结论: - 对“用户移动窗口”:强。 - 对“用户关闭窗口/进程”:中强,可自动重启。 - 对“用户在关键发送瞬间抢焦点/操作同一窗口”:当前还不是强,需要动作级锁定和发送前后校验。 - 对“应用崩溃/服务端不可用”:只能自动拉起窗口;业务登录/聊天能力仍受真实服务端影响。 本轮验证结果: - 新启动进程:`IMPlatformClient.exe` - PID:`20060` - 主窗口:`0x340330` - UIA 根控件: - `automation_id=frmLogin` - `framework_id=WinForm` - `class_name=WindowsForms10.Window.8.app.0.d3a00f_r7_ad1` - UIA dump 仍可读,即使窗口处于屏幕外: - `is_offscreen=true` - 子控件 `skinState`、`skinLoadPanel` 可见于控件树 ## 推荐无感等级 ### L1:当前用户会话内屏幕外运行 适合当前开发机验证: ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File E:\coding\codex\isphere-ai-bridge\scripts\open-offline-real-client-window.ps1 -UserSilent ``` 优点: - 实现最快。 - 不影响当前屏幕。 - UIA 读控件可继续工作。 限制: - 如果某些发送动作必须依赖真实鼠标点击或 OCR 截图,屏幕外模式不适合。 - 发送路径应优先使用 `ValuePattern`、`InvokePattern`、`WM_SETTEXT`、`BM_CLICK` 等 HWND/UIA/Win32 方式。 ### L2:当前用户会话内可见但不激活 适合排查窗口状态: ```powershell 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 用户会话里做,不能放当前用户桌面长期运行。