Files
2026-07-13 13:04:19 +08:00

49 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# computer_use
相关L3 memory: **ui_detect.py** ljqCtrl.py/ljqCtrlBg.py ljqCtrl_sop.md
## 0. GUI操作节奏建议
进入新界面时,建议先只探测不操作:枚举窗口 + UIA + ljqCtrl截图 + ui_detect,读完实际输出再决定下一步
明确一个操作后,可以在同一轮执行该动作,短暂等待,再立刻枚举窗口 + 截图/ui_detect 验证新状态;不要在未知状态下把多步决策写进大脚本
尽量不要预测关键词筛候选,应看 detect 输出、坐标、层级和上下文判断
若确定UIA可用则少用ui_detect/ljqCtrl;若UIA不可用,则后续不用UIA
## 1. 基础规则
### 探测/定位四工具(按优先级降级,前者无效才用后者)
| 工具 | 用法时机 | 能力/适用 | 限制 |
|------|----------|-----------|------|
| 0 win32gui 窗口枚举 | 始终先行,总是可用 | 枚举标题/类名/rect,确定目标窗口、前台状态、客户区原点 | 仅定位窗口,不进控件 |
| 1 Python UIA(控件树)| 首选探测+操作 | 控件树可用时,探测与操作(含免坐标点击)都用 UIA | **游戏禁用**;对该窗口一旦无效则后续也不用 |
| 2 ui_detect.py(配合ljqCtrl截图) | 1无效时才用 | 截图视觉检测控件,返回 bbox+OCR 文本 | bbox 是截图内坐标需转屏幕物理坐标 |
| 3 vision(VLM) | 2仍不足时才用 | 仅语义理解、确认界面状态、辅助判断目标 | 不可信其坐标 |
Windows 下窗口截图和操作使用 ljqCtrl:严禁 pyautogui;记得先 Activate 到前台(除非用户明确要求后台操作或后台操作失效)
ui_detect附送OCR,不要单独使用OCR
用PIL传输图像,或者用统一1.png存储截图,不要创建大量截图文件
ui_detect 的 bbox 是截图内坐标,点击前必须用 `ClientToScreen(hwnd,(0,0))/dpi_scale + bbox中心` 转屏幕物理坐标
坐标转换禁用 `GetWindowRect` 或 DWM 窗口矩形直接加截图坐标(含标题栏/边框/阴影会错位)
ljqCtrl.Click 后会返回像素/前台变化,0% 或近 0% 变化立即停下诊断,禁止盲目重试。
ljqCtrl 失效或目标为网络游戏时,必须使用硬件键鼠 Xbananakb / Arduino Leonardo(如有)
网络游戏除非用户明确允许,严禁普通键鼠事件,必须硬件执行。
临时截图/可视化文件用后清理,或固定文件名覆盖,避免堆积。
ui_detect 可跨端复用;手机端沿用本原则时,UIA 换成 ui dump/adb_uiljqCtrl 控制换成 adb
### 重要必坑
坑1-遮盖/失焦:混乱时枚举窗口确认前台;
坑2-DPI:必须先import ljqCtrl,之后一律使用物理坐标;
## macOS 平台
macOS 定位链与 §1 一致,工具映射如下:
- 控制层:`import macljqCtrl as ljqCtrl`(替代 Windows ljqCtrl
- 窗口枚举:`ListWindows()` → 返回 id/app/title/bbox/pid(替代 win32gui
- 激活:`ActivateApp(pid)`pid 来自 ListWindows,禁止用名字子串——同厂商 bundle 前缀会误伤)
- UIA 层 = AX 辅助功能 API`AXElements(pid)` 枚举控件树 → role/desc/title/id/物理坐标 xywh`AXFind(pid, role=, desc=, title=)` 过滤;`AXPress(el)` 免坐标点击
- 坐标:AX 返回逻辑点,库内自动 /dpi_scale 转物理像素,与 Click/Screenshot 统一;Retina 默认 scale=0.5
- 截图:`GrabWindow(window_id)``ScreenCapAt(x, y, radius)`(物理坐标)
- 权限:首次使用需授予「辅助功能」权限(系统设置 > 隐私与安全 > 辅助功能);`AXIsProcessTrusted()` 检测
- 依赖:`pip install pyobjc-framework-ApplicationServices`(AX 相关,软依赖——未装时键鼠/截图正常,仅 AX 函数不可用)
- 节奏同 §2:先 ListWindows + AXElements 探测,确认控件后再操作;AXPress 优先,回退 Click(phys_cx, phys_cy)